控制流
翻译整理自 cppreference - 控制语句。
1. if / else
if (a > b) {
max = a;
} else if (a == b) {
/* ... */
} else {
max = b;
}陷阱:
if (n > 0)
if (n > 100) puts("big");
else
puts("non-positive"); // 实际属于内层 if
建议总是用
{}包裹。
2. switch / case
switch (op) {
case '+':
result = a + b;
break; // 必须 break,否则穿透
case '-':
result = a - b;
break;
case '*':
case 'x': // 多个 case 共享代码
result = a * b;
break;
default:
printf("unknown op");
}
case后必须是常量表达式。
3. while / do-while
while (n > 0) {
n--;
}
do {
n--;
} while (n > 0); // 至少执行一次
4. for
for (int i = 0; i < n; i++) { // C99+ 可在 for 内声明
sum += i;
}
for (;;) { // 无限循环
if (cond) break;
}5. break / continue / goto
for (i = 0; i < n; i++) {
if (arr[i] == target) {
found = 1;
break;
}
if (arr[i] == 0) {
continue; // 跳过本次
}
}
// goto 用于跳出多层嵌套
for (...) {
for (...) {
if (err) goto cleanup;
}
}
cleanup:
free(buf);6. 常见模式
遍历数组
for (int i = 0; i < N; i++) {
printf("%d ", arr[i]);
}死循环带退出
while (1) {
int ch = getchar();
if (ch == EOF) break;
}状态机
while (state != END) {
switch (state) {
case INIT: ...; break;
case READ: ...; break;
case PROC: ...; break;
case END: break;
}
}小结
C 控制流与多数语言类似,但没有异常机制,需要通过返回值与 goto 处理错误。下一章学习函数。