在学习c语言编程的时候,接触过goto关键字,用于控制跳转到程序的哪一个地方继续执行,其实goto最早起源于汇编语言。Java中没有goto,然后Java中通过break和continue也能实现类似的跳转,这与break和continue两个关键字有关。它们其实不是跳转,而是中断迭代语的一种方法,他们实现的机制跟goto的实现机制类似,都是通过标签。形式如下:label1:
outer-iteration { inner-iteration { //... break; // (1) //... continue; // (2) //... continuelabel1; // (3) //... breaklabel1; // (4) } }
(1) 中,break终端内部迭代,回到外部迭代。
(2) 中,continue使执行点回到内部迭代的下一次迭代执行中。
(3) 中,continue label1同时中断内部迭代和外部迭代,直接转到label1处,随后他从外部迭代开始继续执行。
(4) 中,break label1也会中断所有迭代,并回到label1处,但并不重新进入迭代,它实际中断了两个迭代。
下面通过for循环的例子来领悟一下标签的使用:
importstaticnet.mindview.util.Print.*; publicclassLabeledFor { publicstaticvoidmain(String[] args) { inti=0; outer: // Can’t have statements here for(; true ;) { // infinite loop inner: // Can’t have statements here for(; i<10; i++) { print("i = "+i); if(i==2) { print("continue"); continue; } if(i==3) { print("break"); i++; // Otherwise i never // gets incremented. break; } if(i==7) { print("continue outer"); i++; // Otherwise i never // gets incremented. continueouter; } if(i==8) { print("break outer"); breakouter; } for(intk=0; k<5; k++) { if(k==3) { print("continue inner"); continueinner; } } } } // Can’t break or continue to labels here } }
/* Output:
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
*///:~
注意,break会中断for循环,而且在抵达for循环的末尾之前,递增表达式不会执行。由于break跳过了递增表达式,所以在i==3的情况下直接对i执行递增运算。在i==7的情况下,continue outer语句会跳转到循环顶部,而且也会跳过递增。如果没有break outer循环语句不会从内部循环跳转到外部循环。当然如果想直接终端循环,通过一个return即可。下面展示一个while循环使用标签的例子:
importstaticnet.mindview.util.Print.*; publicclassLabeledWhile { publicstaticvoidmain(String[] args) { inti=0; outer: while(true) { print("Outer while loop"); while(true) { i++; print("i = "+i); if(i==1) { print("continue"); continue; } if(i==3) { print("continue outer"); continueouter; } if(i==5) { print("break"); break; } if(i==7) { print("break outer"); breakouter; } } } } }
/* Output:
Outer while loop
i = 1
continue
i = 2
i = 3
continue outer
Outer while loop
i = 4
i = 5
break
Outer while loop
i = 6
i = 7
break outer
*///:~
同样的规则亦适用于while循环:
1、一般的continue会退出最内层循环的开头,并继续执行。
2、带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。
3、一般的break会中断并跳出当前循环。
4、带标签的break会中断并跳出标签所指的循环。
要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套,而且想从多层循环中break和continue到指定位置。
可以看到,使用标签会使程序变得复杂,降低可读性,现在很少使用;但是使用标签可以提高程序的灵活度。建议慎用。