break 写在循环里时,立刻结束最内层循环,后面的轮次不再执行;写在 switch 里时,结束这次 switch,不再落入后面的 case。continue 则跳过本轮尚未执行的语句,回到循环条件再开始下一轮;它们一般都写在 if 里,用来在找到目标后停止,或跳过当前不需要处理的元素。Java、Python 等也有同名语句。本节说明它们在 for、while、switch 和嵌套循环里分别做什么。
break 结束整个循环,后面各轮都不再执行;continue 只跳过本轮,循环本身还继续。
break:结束整层循环
执行到 break 后,控制转到该循环后面的第一条语句。只退出它所在的那一层,外层循环不受影响。
条件成立时执行 break,直接退出循环;不成立则继续本轮。
for (int i = 1; i <= 9; ++i) {
if (i * i > 30) {
std::cout << i << "\n";
break;
}
}因为 6×6 已经大于 30,所以打印 6 后立刻离开,7、8、9 不会再算。
continue:跳过本轮剩余语句
continue 不结束循环。对计数 for,仍会执行更新子句(如 ++i),再回到条件;对范围 for,进入下一个元素。
continue 跳过本轮剩余语句,回到循环条件(for 仍会执行更新子句)。
for (int i = 1; i <= 5; ++i) {
if (i % 2 == 0) {
continue;
}
std::cout << i << " ";
}因为 2 和 4 是偶数,所以被跳过;奇数 1、3、5 照常打印。循环本身会跑完。
合在一起:过滤后再提前停止
下面这个例子先跳过偶数,再在遇到大于 4 的奇数时结束。数据是 1、3、8、5、4。
#include <iostream>
#include <vector>
int main() {
std::vector<int> v{1, 3, 8, 5, 4};
for (int n : v) {
if (n % 2 == 0) {
continue; // 跳过偶数
}
if (n > 4) {
break; // 遇到大于 4 的奇数则停止
}
std::cout << n << " ";
}
std::cout << "\n";
return 0;
}输出:
1 3 因为 1、3 是奇数且不大于 4,所以打印出来;因为 8 是偶数,所以走 continue,本轮不再判断 n > 4;因为下一个奇数 5 大于 4,所以 break,后面的 4 不再处理。
| 语句 | 作用 | 典型场景 |
|---|---|---|
break | 结束最内层循环或 switch | 已找到目标、收到退出命令 |
continue | 跳过本轮剩余语句,进入下一轮 | 过滤偶数、空行、非法输入 |
while 里 continue 可能停不下来
对 for,continue 之后仍会执行 ++i。对 while,控制直接回到条件。若把计数写在循环体末尾,又被 continue 跳过,条件就一直为真。
int i = 0;
while (i < 5) {
if (i % 2 == 0) {
continue; // i 仍是 0,条件一直成立
}
std::cout << i << " ";
++i;
}因为一开始 i 是 0,满足偶数条件后直接回到 while (i < 5),++i 从未执行。正确写法是先更新再判断,或把过滤条件改成不挡住更新:
int i = 0;
while (i < 5) {
++i;
if (i % 2 == 0) {
continue;
}
std::cout << i << " ";
}过滤容器元素时,更宜用范围 for 加 continue,不必手写计数。
switch 中的 break
switch 里的 break 只结束 switch,不会结束外面的循环。某个 case 若缺少 break,会继续执行后面的 case(贯穿)。仅在有意共用后续语句时才省略,并应写明原因。分支写法见条件分支。
int cmd = 1;
switch (cmd) {
case 1:
std::cout << "one ";
break;
case 2:
std::cout << "two ";
break;
default:
std::cout << "other";
break;
}因为 cmd 是 1,所以打印 one 后遇到 break,不会落到 case 2。
嵌套循环
C++ 没有带标号的 break。break 只退出最内层。需要同时离开两层时,可设布尔标志,在外层再 break 一次;或把双重循环放进函数,命中后 return。在容器里查找时,更宜用 std::find / std::find_if,见STL 算法与标准库 <algorithm>。
bool found = false;
for (const auto& row : matrix) {
for (int x : row) {
if (x == target) {
found = true;
break; // 只离开内层
}
}
if (found) {
break; // 再离开外层
}
}内层 break 之后外层仍会进入下一行。因为设置了 found,所以外层随后也会离开。
与 return
return 结束整个函数,循环内外尚未执行的语句都不再运行。break 只结束当前循环或 switch。查找类函数里,命中后直接 return,往往比两层标志更清楚。
本节说明了 break 与 continue 在循环、switch 与嵌套中的分工。下一章从函数开始。