Z
ZHANK
控制流程

break/continue/goto

循环控制、跳出多重循环的 goto、使用场景与禁忌

break/continue/goto

循环不只能从头走到尾——break 提前退出、continue 跳过一次、goto 跨层跳出。

学完本章你将: 掌握 break/continue 区别、goto 的使用场景与禁忌。


break —— 退出整个循环

c
// 找到第一个能被 7 整除的数就退出
for (int i = 1; i <= 100; i++) {
    if (i % 7 == 0) {
        printf("找到了:%d\n", i);  // 7
        break;
    }
}

continue —— 跳过本次、继续下次

c
// 只打印偶数
for (int i = 1; i <= 10; i++) {
    if (i % 2 != 0) {
        continue;  // 奇数跳过
    }
    printf("%d ", i);  // 2 4 6 8 10
}

break vs continue

c
for (int i = 1; i <= 5; i++) {
    if (i == 3) break;
    printf("%d ", i);
} // 输出:1 2

for (int i = 1; i <= 5; i++) {
    if (i == 3) continue;
    printf("%d ", i);
} // 输出:1 2 4 5

goto —— 进阶跳出多重循环

大多数时候不需要 goto,但有它可以让跳出多层循环更优雅:

c
// 不用 goto 的写法(需要额外的标志位)
int found = 0;
for (int i = 0; i < 10 && !found; i++) {
    for (int j = 0; j < 10; j++) {
        if (data[i][j] == target) { found = 1; break; }
    }
}

// 用 goto 的写法(更直接)
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        if (data[i][j] == target) goto found;
    }
}
found:
printf("找到了\n");

⚠️ goto 的唯二正道: ① 跳出多层循环;② 统一的错误处理出口(Linux 内核大量使用)。绝不用 goto 实现循环或条件——那是 1960 年代的做法。