for(..)
for(..)
for(..){
break; //this will break out from the most inner loop OR all 3 iterated loops?
}
for(..)
for(..)
for(..){
break; //this will break out from the most inner loop OR all 3 iterated loops?
}
你的示例只会跳出最内层的循环。然而,使用标记的break语句,可以做到这一点:
outer:
for(..)
for(..)
for(..){
break outer; //this will break out from all three loops
}
这将只会从内部循环中跳出。您还可以定义一个范围以跳出。更多详情请查看语言规范:
没有标签的break语句试图转移控制到最近的外层switch、while、do或for语句,或者立即包含该方法或初始化块的语句;称为break目标的这个语句随后立即正常完成。
是的,如果没有标签,它只会中断最内层循环。
不必使用标签,您可以将循环放在一个单独的函数中,并从该函数返回。
class Loop {
public void loopForXx() {
untilXx();
}
private void untilXx() {
for()
for()
for()
if(xx)
return;
}
}
从最内部的循环开始 :)
int i,j,k;
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
for(k = 0; k < 2; k++)
{
printf("%d %d %d\n", i, j, k);
break;
}
将会产生:
0 0 0
0 1 0
1 0 0
1 1 0
你应该看一下这里:http://java.sun.com/docs/books/tutorial/java/nutsandbolts/branch.html
这个链接是关于Java编程语言中的分支语句的教程。常常提到我不喜欢打破标签。所以在for循环中,大多数时候我会添加一个布尔变量来简单退出循环..(只有当我想要打破它的时候;))
boolean exit = false;
for (int i = 0; i < 10 && !exit; i++) {
for (int j = 0; j < 10 && !exit; j++) {
exit = true;
}
}
在我看来,这比使用break更优雅。
这里有很多人不喜欢标签和跳出。这种技术可以比作使用'goto'语句,即流程控制语句,允许以非标准的方式跳出代码块,忽略前置条件和后置条件。Edsger Dijkstra在ACM通信期刊上发表了一篇著名的文章,日期是1968年3月,“Goto statement considered harmful”(它是一个简短的读物)。
使用TimW建议的从迭代内部返回的同样理由也是不好的。如果我们严格按照创建可读代码、具有可预测的进入点和退出点的原则,那么应该在方法开始时初始化保存返回值(如果有的话)的变量,并仅在方法结束时返回。
当我们使用迭代来执行查找时,这提出了一个挑战。为了避免使用break或return,只能最终得到一个带有常规停止条件和某些布尔变量来指示查找成功的while循环:
boolean targetFound = false;
int i = 0;
while (i < values.size() && ! targetFound ) {
if (values.get(i).equals(targetValue)) {
targetFound = true;
}
}
if (!targetFound) {
// handle lookup failure
}
好的,这个方法可以运行,但是对我来说有点笨重。首先,我必须引入一个布尔值来检测查找是否成功。其次,我必须在循环后显式地检查targetFound以处理查找失败。
我有时会使用这个解决方案,我认为它更加简洁易读:
lookup: {
for(Value value : values) {
if (value.equals(targetValue)) {
break lookup;
}
}
// handle lookup failure here
}
我认为在这里违反规则(无恶意)会导致更好的代码。
它将从最内部的循环中退出,
如果你想要从所有循环中退出,你可以定义一个变量并在需要退出时改变其值,然后在每个for循环的开头控制它。