第3.6章: break
break 语句
break 语句立刻终止最近的循环,并从循环之后的语句
继续执行。
break;
break 只跳出一层循环——最内层的那一个。
while 循环中的 break
这个循环在 i == 50 时提前终止。
::std::uint_least32_t i{};
::std::uint_least32_t sum{};
while (i != 100) {
if (i == 50) {
break; // exit the loop
}
sum = sum + i;
++i;
}
println("sum of [0,50) = ", sum);
for 循环中的 break
在 for 循环中,break 的行为完全相同。
::std::uint_least32_t sum{};
for (::std::uint_least32_t i{}; i != 100; ++i) {
if (i == 10) {
break;
}
sum = sum + i;
}
println("sum of [0,10) = ", sum);
死循环中的 break
死循环会永远运行,除非循环体内有东西让循环停下。
::std::uint_least32_t i{};
for (;;) { // infinite loop
if (i == 5) {
break; // exit the loop
}
println("i=", i);
++i;
}
这个循环之所以会结束,完全是因为 break。
带初始化语句的循环中的 break
即使循环使用了初始化语句,break 也照常工作。
for (auto i = 0; i < 100; ++i) {
if (i == 3) {
break;
}
println("i=", i);
}
嵌套循环
break 只跳出最内层循环。
for (::std::uint_least32_t i{}; i != 3; ++i) {
for (::std::uint_least32_t j{}; j != 3; ++j) {
if (j == 1) {
break; // exits only the inner loop
}
println("i=", i, ", j=", j);
}
}
未来提案:带标签的 break(P3568)
C++ 委员会正在讨论一项提案(P3568),它将为语言添加
带标签的 break。
这一特性尚未成为 C++ 的一部分,但可能出现在未来的标准中。
其想法是让 break 能直接跳出外层循环。
标签必须出现在你想跳出的循环之前。
示例(提案语法)
outer:
for (::std::uint_least32_t i{}; i != 3; ++i) {
for (::std::uint_least32_t j{}; j != 3; ++j) {
if (j == 1) {
break outer; // exits the loop labeled "outer"
}
println("i=", i, ", j=", j);
}
}
标签必须放在循环头部之前。
你不能把标签放在循环之后,也不能放在 for 关键字之后。
再次强调,这在今天的 C++ 中并不合法。
此处展示它,只是为了说明 break 未来可能如何演进。
伪图:break 跳向何处
┌───────────────┐
│ loop │
│ begins │
└───────┬───────┘
│
▼
┌───────────────┐
│ cond │─── false ───▶ loop ends
└───────┬───────┘
│ true
▼
┌───────────────┐
│ body │
└───────┬───────┘
│
├──▶ if (break) ───────────────▶ loop ends
│
▼
┌───────────────┐
│ step │
└───────┬───────┘
│
└─────────────── back to cond
要点
- break 跳出最近的循环:它不会跳出外层循环。
- break 能终止死循环:对
for(;;)和while(true)很有用。 - break 适用于任何循环:
while、for和do while。 - 带初始化语句的 break:行为正常。
- 嵌套循环:只有最内层循环会被跳出。
- 带标签的 break(P3568):提案中的特性;标签必须出现在循环之前。
- 清晰性:有意识地使用
break;不要把它深埋在复杂逻辑里。