默认情况下,循环语句会一直运行到判断条件变为 false 才停下来。如果我们在循环过程中已经拿到了想要的结果,希望立刻终止并跳出循环,就可以使用 break 语句。
break 在英文中是 “断开、中断” 的意思。在 C++ 中,break 语句专门用于提前退出 “本层” 循环,或者跳出 switch 语句的分支。
C++ break 基本使用
在 C++ 中,当程序在循环体或 switch 分支中执行到 break; 时,会立即终止当前所在的这一个结构,直接跳到花括号 {} 外面继续往下执行。
语法:
break;说明:
break 语句只能用于以下 2 个地方,不能单独用于其他地方:
- 循环语句:包括 for 循环、while 循环和 do...while 循环,通常配合
if条件判断一起使用。 - switch 语句:用于在执行完匹配的
case分支后,跳出整个switch结构。
示例 1:在 for 循环中提前退出
#include <iostream>
int main() {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break;
}
std::cout << i << '\n';
}
return 0;
}运行结果如下。
1
2
3
4分析:
在这个例子中,for 循环的条件是 i <= 10,原本会从 1 输出到 10。但当 i 的值变为 5 时,判断条件 i == 5 返回 true,程序执行 break; 直接退出整个循环,当轮后面的输出以及后续 6 ~ 10 的循环都不会再执行。
可能有些小伙伴会问:“示例 1 里的 break; 明明写在 if 的花括号里面,怎么说它不能用于 if 语句呢?”
其实,break 服务的对象始终是包裹它的循环语句或 switch 语句,而不是普通的 if 代码块。上面之所以合法,是因为这个 if 位于 for 循环内部,break 真正退出的是外面的 for 循环。
如果脱离了循环或 switch,单独在普通的 if 语句里写 break;,编译时就会直接报错:
int score = 85;
if (score >= 60) {
std::cout << "考试通过\n";
break; // 编译报错
}除了在固定次数的循环中提前退出,在实际开发中我们还经常先写一个 while (true) 循环,然后在循环内部通过 if 判断配合 break 来决定什么时候停下来。
示例 2:配合 while (true) 按条件退出
#include <iostream>
int main() {
int sum = 0;
int n = 1;
while (true) {
sum += n;
if (sum >= 20) {
break;
}
n++;
}
std::cout << "累加到 " << n << " 时,总和达到 " << sum << '\n';
return 0;
}运行结果如下。
累加到 6 时,总和达到 21分析:
在开始累加前,我们并不知道从 1 加到哪个数时总和会达到 20,因此在 while 小括号里直接写上 true,让累加一直进行下去。
每一轮循环先把当前的 n 加进 sum,紧接着判断 sum >= 20 是否成立。当 n 为 6 时,sum 累加到 21,程序遇到 break; 立即跳出循环。由于 break 写在 n++ 之前,跳出循环时 n 刚好停留在 6,不会多加 1。
除了用于循环语句之外,break 在 switch 多分支结构中也经常使用。下面我们再通过一个例子回顾一下它在 switch 中的作用。
示例 3:在 switch 语句中跳出分支
#include <iostream>
int main() {
int season = 2;
switch (season) {
case 1:
std::cout << "春\n";
break;
case 2:
std::cout << "夏\n";
break;
case 3:
std::cout << "秋\n";
break;
case 4:
std::cout << "冬\n";
break;
default:
std::cout << "季节不正确\n";
break;
}
return 0;
}运行结果如下。
夏分析:
程序从第一个 case 开始依次匹配,命中 case 2 并输出 “夏” 之后,遇到 break; 就会直接退出整个 switch 结构,后面的 case 3、case 4 和 default 分支都不会再执行。
多层循环中的 break
当循环内部还嵌套了另一层循环时,有一个初学者很容易误解的细节:break 语句只会退出包裹它的 “本层” 循环,而不会一次性退出所有层的循环。下面我们来看一个例子。
示例 4:在双层循环中使用 break
#include <iostream>
int main() {
for (int i = 1; i <= 2; i++) {
std::cout << "第 " << i << " 轮外层循环:";
for (int j = 1; j <= 5; j++) {
if (j == 3) {
break;
}
std::cout << j << ' ';
}
std::cout << '\n';
}
return 0;
}运行结果如下。
第 1 轮外层循环:1 2
第 2 轮外层循环:1 2分析:
从运行结果可以看出,外层循环一共正常执行了两轮,每一轮的内层循环都只输出了 “1 2”。具体执行过程如下:
- 第 1 轮外层循环:
i为 1,进入内层j循环依次输出 1 和 2。当j变为 3 时遇到break;,直接退出内层循环,后面的 3、4、5 不再输出,随后执行外层循环末尾的换行。 - 第 2 轮外层循环:刚才的
break;只结束了内层循环,外层i循环并没有受影响,因此i变为 2 继续执行下一轮。内层循环同样在输出 1 和 2 后遇到j == 3提前退出。
简单来说,break 写在哪一层循环的花括号 {} 里面,它就只负责跳出哪一层循环。同理,如果一个 switch 语句嵌套在循环内部,switch 分支里的 break; 也只会结束这个 switch 本身,而不会把外面的循环停掉。
如果在双层循环中需要同时退出内外两层循环,我们可以在外层循环前先定义一个布尔标志变量,比如 bool stop = false;。当内层准备跳出时,先把 stop 改为 true 再执行 break;,回到外层后判断 if (stop) 再执行一次 break; 就能全部退出了。
提示 在 C++ 中,break 语句和 continue 语句都用于控制循环流程:break 会直接结束整个本层循环,而 continue 只跳过当前这一轮循环。
