在Java中,break如何与嵌套循环交互?

Cra*_*aig 39 java break

我知道一个break语句跳出循环,但是它是跳出嵌套循环还是只是它当前的循环?

tem*_*def 81

没有任何装饰,break只会突破最内层的循环.因此在这段代码中:

while (true) { // A
    while (true) { // B
         break;
    }
}
Run Code Online (Sandbox Code Playgroud)

break只有退出循环B,所以代码将永远循环.

但是,Java有一个名为"命名中断"的功能,您可以在其中命名循环,然后指定要突破的循环.例如:

A: while (true) {
    B: while (true) {
         break A;
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码不会永远循环,因为break显式离开循环A.

幸运的是,这同样的逻辑适用于continue.默认情况下,continue执行包含continue语句的最内层循环的下一次迭代,但也可以通过指定循环标签继续执行来跳转到外循环迭代.

在Java以外的语言中,例如C和C++,这种"标记中断"语句不存在,并且不容易打破多重嵌套循环.它可以使用goto语句来完成,尽管这通常是不受欢迎的.例如,假设您愿意忽略Dijkstra的建议并使用goto以下内容,这就是嵌套中断在C中的样子:

while (true) {
    while (true) {
        goto done;
    }
}
done:
   // Rest of the code here.
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 好答案.但是,如果你发现自己正在使用命名的休息时间,那么你很可能不是"正确的方式".:-) (15认同)
  • 命名休息并不是那么糟糕,有些情况下他们是最好的选择.然而,每年使用它们往往超过两次是奇怪的. (6认同)
  • 命名中断没有错,特别是如果替代是多个控制变量和复杂的条件逻辑. (3认同)
  • 请为了看你的代码的人,不要使用命名的休息! (2认同)

biz*_*lop 4

默认情况下,它跳出最内层循环。但是您也可以指定标签并使其跳出外循环