控制流

翻译整理自 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 处理错误。下一章学习函数。