Skip to content

控制流 ​

CIN 的控制流与 C 基本一致: 条件必须写在圆括号里, 代码块用 {}; 单语句体可以省略花括号。 语句以换行结尾, 因此块内的换行不会被忽略。

if / else ​

cin
if (x > 0) {
    println("positive")
} else if (x == 0) {
    println("zero")
} else {
    println("negative")
}

单语句体可以省略花括号 (但建议始终加上):

cin
if (done) return
if (!ready) println("not ready")

条件表达式可以是任意能求值成 bool 的表达式; && / || 短路求值, ! 取反。

while ​

cin
int n = 10
int sum = 0
while (n > 0) {
    sum = sum + n
    n = n - 1
}
println("sum = " + sum)      // sum = 55

while (true) { ... } 是常用的无限循环写法, 用 break 退出。

for ​

cin
for (int i = 0; i < 10; i = i + 1) {
    println("i = " + i)
}
  • 三段 (init / cond / update) 都可以省略: for (;;) { break };
  • init 段支持类型声明, 也支持赋值表达式 (for (i = 0; i < n; i = i + 1)), 适合给已有变量赋初值;
  • init 段声明的变量作用域覆盖整个循环;
  • update 段是赋值表达式, 也可以写 i++ 或 i += 2;
  • 条件为空视为恒真。

范围 for (遍历定长数组) ​

for (T v : arr) 逐个把元素拷进 v:

cin
int data[5] = {10, 20, 30, 40, 50}

int total = 0
for (int v : data) {
    total = total + v            // 10+20+30+40+50
}
println(int_to_str(total))       // 150

string names[3] = {"ann", "bob", "cid"}
for (string s : names) {
    println(s)                   // 每行一个名字
}
  • 被遍历对象必须是定长数组 (int a[5] / float m[3] / string names[3], 含声明为 int[5] 的形参); 指针形式 (int[] / int[][]) 报 range-for requires a fixed-size array;
  • 元素类型不能是数组 —— 多维数组用下标循环, 否则报 range-for over multi-dimensional arrays is not supported;
  • 循环变量每轮迭代拷贝当前元素, 改它不影响原数组; 元素类型可为标量 / string / struct;
  • break / continue 语义与普通 for 相同 (continue 直接进入下一个元素)。
text
150
ann
bob
cid

do-while ​

cin
int n = 0
do {
    n++
} while (n < 3)
println("n = " + n)          // n = 3

循环体至少执行一次, 条件在体后求值; 结尾的 while (...) 之后不需要分号 (写了也可以)。

break / continue ​

cin
int sum = 0
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 1) continue     // 跳过奇数
    if (i > 8) break             // 超过 8 提前结束
    sum += i                     // 只累加偶数
}
println("sum = " + sum)          // sum = 20
  • break 跳出最近一层 switch 或循环;
  • continue 跳到循环的条件求值处 (for 会先执行 update 段);
  • 在 switch 内部的循环里, continue 作用于循环、break 作用于 switch。

switch / case / default ​

cin
int grade = 75
int tier = grade / 25            // '/' 是浮点除, 赋给 int 时截断
switch (tier) {
    case 0: println("level: low");    break
    case 1: println("level: medium"); break
    case 2:
    case 3: println("level: high");   break   // case 贯穿 (fallthrough)
    default: println("level: top")
}

实测输出:

text
level: top

规则:

  • 选择表达式与 case 常量必须是整数; case 支持常量表达式 (case 2+3)、字符字面量 (case 'A') 与枚举成员;
  • 一个 case 标签可以列多个值与闭区间 lo..hi (逗号分隔, 可混用, 支持负数);
  • 分支体默认贯穿到下一个 case (与 C 一致), 用 break 跳出整个 switch;
  • break 跳出的是最近一层 switch/循环; switch 内嵌套循环时 continue 仍作用于循环;
  • default 可以出现在任意位置, 无匹配时执行; 没有 default 且无匹配则整段跳过;
  • switch 不会自动为最后一个分支加 break。

多值与范围写法:

cin
switch (n) {
    case 1, 2, 7..9:  println("small or 7-9"); break
    case -3..-1:      println("negative");     break
    case 10, 20..25:  println("mixed");        break
    default:          println("other")
}

7..9 是闭区间 (含 7 与 9), 要求 lo <= hi, 否则报 Empty case range: lo..hi; 多值/范围只是把多个比较合到一个分支, 贯穿语义不变。

多分支也可以用 if 链

case 常量必须是编译期整型常量 (可用枚举成员与范围); 需要字符串判断时用 if / else if 链 (字符串用 strcmp(a, b) == 0)。

三目表达式 ​

cin
string status = (score >= 60) ? "pass" : "fail"
int sign = (x < 0) ? -1 : 1
int abs_x = (x < 0) ? -x : x
  • 三目是短路表达式: 只求值被选中的一侧, 另一侧的副作用不会发生;
  • int/float 混用时按 float 提升; 两侧同为 string 才允许字符串结果;
  • 可以嵌套, 但超过两层建议改写成 if 链。

完整示例 ​

examples/control_flow.cin (仓库自带, 实测输出如下):

cin
function main() -> int {
    int sum = 0
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 1) continue
        if (i > 8) break
        sum += i
    }
    int d = 0
    do {
        d++
    } while (d < 4)

    int grade = 75
    int tier = grade / 25
    switch (tier) {
        case 0: println("level: low");    break
        case 1: println("level: medium"); break
        case 2: println("level: high");   break
        default: println("level: top")
    }

    string ok = (grade >= 60) ? "pass" : "fail"
    println("sum=" + int_to_str(sum) + " d=" + int_to_str(d) + " " + ok)
    return sum + d
}
text
level: top
sum=20 d=4 pass

常见错误 ​

现象原因处理
Expected RBRACE ... at line N花括号不配对, 或块内语句缺少换行检查第 N 行附近
switch 分支“串”到一起忘了 break, 分支默认贯穿每个分支末尾加 break
case 报错case 常量不是整数常量表达式用整数、枚举成员或常量表达式
Empty case range: lo..hicase 范围写反 (lo > hi)保证 lo <= hi
range-for requires a fixed-size arrayfor (T v : arr) 遍历了 int[] 指针形式数组用定长数组或下标循环
range-for over multi-dimensional arrays is not supported遍历了多维数组用两层下标循环
死循环--max-instructions 上限内未退出检查循环条件; 上限默认 1 亿
do-while 少执行一次条件写在体前 (写成了 while)确认使用 do { } while (...)

相关页面 ​

文档由 VitePress 构建