编程语言中一开始就有goto关键词了。事实上,goto起源于汇编语言的程序控制:“若条件A成立,则跳到这里;否则跳到那里”。
goto语句是在源码级上的跳转,这使其招致了不好的声誉。若一个程序总是从一个地方跳到另一个地方,还有什么办法能识别程序的控制流程呢?
其实真正的问题并不在于使用goto语句,而在于goto的滥用;而且在少数情况下,goto还是组织控制流程的最佳手段。结束
尽管goto仍是Java中的一个保留字,但在语言中并未使用它;Java没有goto。然而,Java也能完成一些类似于跳转的操作,这与break和continue这两个关键词有关。它们其实不是一个跳转,而是中断迭代语句的一种方法。之所以把它们纳入goto问题中讨论,是因为它们使用相同的机制:标签。
标签是后面跟有冒号的标示符,就想下面这样:
lable1:
在java中,标签起作用的唯一地方刚好是在迭代语句之前。而在迭代之前设置标签的唯一理由是:我们希望在其中嵌套另一个迭代或者一个开关。这是由于break和continue关键词通常只中断当前循环,但若是随同标签一起使用,他们就会中断循环,知道标签所在的地方:
下面是标签在for循环中的示例:
@Test public void TestLable(){ int i=0; outer: for(; true; ){ inner: for(; i<10; i++){ System.out.println("i = "+i); if(i == 2){ System.out.println("continue"); continue; } if(i == 3){ System.out.println("break"); i++; break; } if(i == 7){ System.out.println("continue outer"); i++; continue outer; } if(i == 8){ System.out.println("break outer"); break outer; } for(int k = 0; k < 5; k++){ if(k == 3){ System.out.println("continue inner"); continue inner; } } } } System.out.println("结束"); } 结果: 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 结束
结束
同样的规则亦适用于while:
1)、一般的continue会退回内层循环的开头,并继续执行。
2)、带标签的continue会到达标签的位置,并重新进入紧接在哪个标签后面的循环。
3)、一般的break会中断并跳出当前循环。
4)、带标签的break会中断并跳出标签所指的循环。
重点:在Java中需要使用标签的唯一理由就是因为有循环嵌套的存在,而且想从多层嵌套中break或者continue;
goto语句是在源码级上的跳转,这使其招致了不好的声誉。若一个程序总是从一个地方跳到另一个地方,还有什么办法能识别程序的控制流程呢?
其实真正的问题并不在于使用goto语句,而在于goto的滥用;而且在少数情况下,goto还是组织控制流程的最佳手段。结束
尽管goto仍是Java中的一个保留字,但在语言中并未使用它;Java没有goto。然而,Java也能完成一些类似于跳转的操作,这与break和continue这两个关键词有关。它们其实不是一个跳转,而是中断迭代语句的一种方法。之所以把它们纳入goto问题中讨论,是因为它们使用相同的机制:标签。
标签是后面跟有冒号的标示符,就想下面这样:
lable1:
在java中,标签起作用的唯一地方刚好是在迭代语句之前。而在迭代之前设置标签的唯一理由是:我们希望在其中嵌套另一个迭代或者一个开关。这是由于break和continue关键词通常只中断当前循环,但若是随同标签一起使用,他们就会中断循环,知道标签所在的地方:
下面是标签在for循环中的示例:
@Test public void TestLable(){ int i=0; outer: for(; true; ){ inner: for(; i<10; i++){ System.out.println("i = "+i); if(i == 2){ System.out.println("continue"); continue; } if(i == 3){ System.out.println("break"); i++; break; } if(i == 7){ System.out.println("continue outer"); i++; continue outer; } if(i == 8){ System.out.println("break outer"); break outer; } for(int k = 0; k < 5; k++){ if(k == 3){ System.out.println("continue inner"); continue inner; } } } } System.out.println("结束"); } 结果: 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 结束
结束
同样的规则亦适用于while:
1)、一般的continue会退回内层循环的开头,并继续执行。
2)、带标签的continue会到达标签的位置,并重新进入紧接在哪个标签后面的循环。
3)、一般的break会中断并跳出当前循环。
4)、带标签的break会中断并跳出标签所指的循环。
重点:在Java中需要使用标签的唯一理由就是因为有循环嵌套的存在,而且想从多层嵌套中break或者continue;
@Test public void TestLable(){ int i=0; outer: for(; true; ){ inner: for(; i<10; i++){ System.out.println("i = "+i); if(i == 2){ System.out.println("continue"); continue; } if(i == 3){ System.out.println("break"); i++; break; } if(i == 7){ System.out.println("continue outer"); i++; continue outer; } if(i == 8){ System.out.println("break outer"); break outer; } for(int k = 0; k < 5; k++){ if(k == 3){ System.out.println("continue inner"); continue inner; } } } } System.out.println("结束"); } 结果: 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 结束
结束
同样的规则亦适用于while:
1)、一般的continue会退回内层循环的开头,并继续执行。
2)、带标签的continue会到达标签的位置,并重新进入紧接在哪个标签后面的循环。
3)、一般的break会中断并跳出当前循环。
4)、带标签的break会中断并跳出标签所指的循环。
重点:在Java中需要使用标签的唯一理由就是因为有循环嵌套的存在,而且想从多层嵌套中break或者continue;