控制流
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 = 55while (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
ciddo-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 = 20break跳出最近一层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..hi | case 范围写反 (lo > hi) | 保证 lo <= hi |
range-for requires a fixed-size array | for (T v : arr) 遍历了 int[] 指针形式数组 | 用定长数组或下标循环 |
range-for over multi-dimensional arrays is not supported | 遍历了多维数组 | 用两层下标循环 |
| 死循环 | --max-instructions 上限内未退出 | 检查循环条件; 上限默认 1 亿 |
do-while 少执行一次 | 条件写在体前 (写成了 while) | 确认使用 do { } while (...) |