第3.6章: break

English

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
      

要点