C break、continue 与 goto
更新时间:2026-08-26。本文是
languages/c/主题入门层第 17 篇,也是"控制流"主题的收尾。break、continue 是循环的"刹车"和"换挡",goto 则是名声不好但偶有妙用的老家伙。
本文要回答的问题
- break 和 continue 到底跳到哪里?
- 双层循环怎么一次跳出去?
- goto 是不是碰都不能碰?
一、break:跳出当前的循环 / switch
for (int i = 0; i < 10; i++) {
if (i == 3) break; // i 到 3 时立刻结束整个循环
printf("%d\n", i); // 打印 0 1 2
}break 只管一层:跳出的是最内层的循环或 switch。嵌套循环里 break 只跳内层,外层继续:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) break; // 只跳出 j 循环
printf("(%d,%d) ", i, j); // 打印 (0,0) (1,0) (2,0)
}
}这是新手最容易误解的地方:以为 break 能一次跳出所有循环,实际只能跳一层。
二、continue:跳过本次迭代
for (int i = 0; i < 5; i++) {
if (i == 2) continue; // 跳过 i==2 这一次,继续 i=3
printf("%d\n", i); // 打印 0 1 3 4
}continue 结束的是"本次迭代":跳到循环的更新部分,开始下一次。它不跳出循环。
一个经典误区——while 里 continue 要小心更新语句的位置:
int i = 0;
while (i < 5) {
i++; // 更新放在循环体开头
if (i == 2) continue; // 即使 continue,i 也已经 +1 了
printf("%d\n", i);
}如果把 i++ 放在 continue 之后,continue 会跳过更新 → 死循环。while 里写 continue,先确认更新语句在它前面。
三、嵌套循环一次跳出:goto 的正名时刻
break 只能跳一层,双层循环想"找到目标就全退"怎么办?方法有二:
方法一:flag 标记(无 goto,稍啰嗦):
int found = 0;
for (int i = 0; i < 3 && !found; i++) {
for (int j = 0; j < 3; j++) {
if (match(i, j)) {
found = 1;
break; // 跳内层,外层条件 !found 自然退出
}
}
}方法二:goto(直接,但要用得克制):
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (match(i, j)) {
goto done; // 一次跳出所有循环
}
}
}
done:
printf("完成\n");goto 的坏名声来自滥用(跳来跳去读不懂),但"从嵌套深处向前跳出"是它的合法场景——C 没有 try/finally,goto cleanup(统一资源清理)也是 Linux 内核的惯例。纪律:goto 只允许"向前跳"(跳到后面),禁止"向后跳"(回到前面)。
四、switch 里的 break 别忘了
switch 里 break 跳出的是 switch 本身——switch-case 讲过的 fall-through 坑,本质就是忘了 break。
五、常见坑对照
| 坑 | 现象 | 对策 |
|---|---|---|
| break 想跳出双层 | 只跳了内层 | flag 或 goto |
| while 里 continue 跳更新 | 死循环 | 更新放 continue 前 |
| goto 向后跳 | 逻辑混乱难维护 | 只向前跳 |
| switch 忘 break | 穿透执行 | 见 switch 篇 |
| continue 用在 switch 里 | 作用于外层循环 | 确认语义 |
六、与本站主线衔接
- break/continue/goto 在汇编里就是
jmp指令,见与汇编、性能剖析衔接; goto cleanup的资源清理模式(Linux 内核惯例),见多文件工程与错误处理;- 控制流主题至此完结,下一大主题是函数基础。
一句话总结
break 跳一层(循环或 switch)、continue 跳一次(本轮);嵌套循环想一次全退,用 flag 或"只向前跳"的 goto;while 里 continue 要保证更新语句先执行——控制流的最后一课,跳转用对了代码就顺了。