break与continue
- break:用于强行退出循环,不执行循环中的剩余语句。
- continue:停止当前这次跌代,退回到循环开始处,继续下一次迭代。
pubilc class BreakAndContinue(){
pbulic void main(String [] args){
for(int i=0; ; i++){
if(i == 9){
break;
} else {
continue;
}
System.out.println("abc");
}
}
}
上述代码中,尽管 for 循环没有定义退出循环的条件语句,但是因为存在break
,所以不会形成死循环,因为break
可以跳出循环。
由于continue
的存在,使得当i
在 0 到 8 内,都不会执行后面的输出语句。
goto
C++ 语言中,可以使用 goto 来控制程序的执行顺序,例如:
int main(){
label:
printf("%s/n","abc");
for(int i=0; i<10; i++){
if(i % 2 == 0){
goto label;
}
}
}
上述代码中循环每次执行到i
为偶数时,跳转到label
处,继续往下执行,因此这段代码虽然for
循环带了结束条件,但是由于goto
的原因,导致程序最终是死循环。
goto的利弊
goto
起源于汇编语言的程序控制:若 A 成立,跳转到 labelA 处,否则跳转到 labelB 处。
由于 goto 的滥用,导致在源码级别上跳转操作过多,无法很好的辨识程序的逻辑。
在少数情况下,goto
还是组织控制流程的最佳手段。因此 Java 中虽然没有将 goto 作为关键字而是保留关键字,但是依旧保留了 goto 这种跳转机制,即便没有 goto 这么灵活。
Java 中 break 与 continue 带标签用法
标签是后面跟有冒号的标识符,如下:
label1:
在 Java 中,标签起作用的地方刚好是在迭代语句之前,标签与迭代语句之间不能有任何语句,例如:
label1:
for(int i=0; i<10; i++){}
这是由于 break 与 continue 通常只中断当前循环,而与标签一起使用时,它们会中断循环,跳转到标签处。
下面来看一个例子:
outer:
for (int i=0; ; i++) {
inner:
for(int j=0; j<6; j++){
System.out.println("i="+i+" j="+j);
if (i == 1 && j == 1) {
System.out.println("break");
break;
}
if (i == 2 && j == 2) {
System.out.println("continue");
continue;
}
if (i == 3 && j == 3) {
System.out.println("beak inner");
break inner;
}
if (i == 4 && j == 4) {
System.out.println("continue outer");
continue outer;
}
if (i == 5 && j == 5) {
System.out.println("break outer");
break outer;
}
}
}
System.out.println("abc");
//输出结果:
i=0 j=0
i=0 j=1
i=0 j=2
i=0 j=3
i=0 j=4
i=0 j=5
i=1 j=0
i=1 j=1
break
i=2 j=0
i=2 j=1
i=2 j=2
continue
i=2 j=3
i=2 j=4
i=2 j=5
i=3 j=0
i=3 j=1
i=3 j=2
i=3 j=3
beak inner
i=4 j=0
i=4 j=1
i=4 j=2
i=4 j=3
i=4 j=4
continue outer
i=5 j=0
i=5 j=1
i=5 j=2
i=5 j=3
i=5 j=4
i=5 j=5
break outer
abc
上述代码中,只有当break outer
时,才正真跳出了两重循环。
通过观察结果,可以发现:
break inner
只终止了inner
后面的循环,continue out
是跳到outer
后面的第一层循环前,并且继续这一层循环的下一次循环。break outer
是跳转到outer
处,并结束outer
后的循环。
Java 中使用标签的唯一场景:想从多层嵌套循环中 break 或者 continue