java continue goto_Java中goto和break、continue实现区别
goto 關(guān)鍵字很早就在程序設(shè)計(jì)語言中出現(xiàn)。事實(shí)上,goto 是匯編語言的程序控制結(jié)構(gòu)的始祖:“若條件 A,
則跳到這里;否則跳到那里”。若閱讀由幾乎所有編譯器生成的匯編代碼,就會(huì)發(fā)現(xiàn)程序控制里包含了許多
跳轉(zhuǎn)。然而,goto 是在源碼的級(jí)別跳轉(zhuǎn)的,所以招致了不好的聲譽(yù)。若程序總是從一個(gè)地方跳到另一個(gè)地
方,還有什么辦法能識(shí)別代碼的流程呢?隨著 Edsger Dijkstra 著名的“Goto 有害”論的問世,goto 便從此
失寵。
事實(shí)上,真正的問題并不在于使用 goto ,而在于 goto 的濫用。而且在一些少見的情況下,goto 是組織控制
流程的最佳手段。
盡管 goto 仍是 Java 的一個(gè)保留字,但并未在語言中得到正式使用;Java 沒有 goto 。然而,在 break 和
continue 這兩個(gè)關(guān)鍵字的身上,我們?nèi)匀荒芸闯鲆恍?goto 的影子。它并不屬于一次跳轉(zhuǎn),而是中斷循環(huán)語
句的一種方法。之所以把它們納入 goto 問題中一起討論,是由于它們使用了相同的機(jī)制:標(biāo)簽。
“標(biāo)簽”是后面跟一個(gè)冒號(hào)的標(biāo)識(shí)符,就象下面這樣:
label1:
對(duì) Java 來說,唯一用到標(biāo)簽的地方是在循環(huán)語句之前。進(jìn)一步說,它實(shí)際需要緊靠在循環(huán)語句的前方——在
標(biāo)簽和循環(huán)之間置入任何語句都是不明智的。而在循環(huán)之前設(shè)置標(biāo)簽的唯一理由是:我們希望在其中嵌套另
一個(gè)循環(huán)或者一個(gè)開關(guān)。這是由于 break 和 continue 關(guān)鍵字通常只中斷當(dāng)前循環(huán),但若隨同標(biāo)簽使用,它們
就會(huì)中斷到存在標(biāo)簽的地方。如下所示:
label1:
外部循環(huán){
內(nèi)部循環(huán){
//...
break; //1
//...
continue; //2
//...
continue label1; //3
//...
break label1; //4
}
}
在條件 1 中,break 中斷內(nèi)部循環(huán),并在外部循環(huán)結(jié)束。在條件 2 中,continue 移回內(nèi)部循環(huán)的起始處。但
在條件 3 中,continue label1 卻同時(shí)中斷內(nèi)部循環(huán)以及外部循環(huán),并移至 label1 處。隨后,它實(shí)際是繼續(xù)
循環(huán),但卻從外部循環(huán)開始。在條件 4 中,break label1 也會(huì)中斷所有循環(huán),并回到 label1 處,但并不重
新進(jìn)入循環(huán)。也就是說,它實(shí)際是完全中止了兩個(gè)循環(huán)。
下面是 for 循環(huán)的一個(gè)例子:
// : LabeledFor.java
// Java’s "labeled for loop"
public class LabeledFor {
public static void main(String[] args) {
int i = 0;
outer: // Can't have statements here
for (; true;) { // infinite loop
inner: // Can't have statements here
for (; i < 10; i++) {
prt("i = " + i);
if (i == 2) {
prt("continue");
continue;
}
if (i == 3) {
prt("break");
i++; // Otherwise i never
// gets incremented.
break;
}
if (i == 7) {
prt("continue outer");
i++; // Otherwise i never
// gets incremented.
continue outer;
}
if (i == 8) {
prt("break outer");
break outer;
}
for (int k = 0; k < 5; k++) {
if (k == 3) {
prt("continue inner");
continue inner;
}
}
}
}
// Can't break or continue
// to labels here
}
static void prt(String s) {
System.out.println(s);
}
}
這里用到了在其他例子中已經(jīng)定義的 prt()方法。
注意 break 會(huì)中斷 for 循環(huán),而且在抵達(dá) for 循環(huán)的末尾之前,遞增表達(dá)式不會(huì)執(zhí)行。由于 break 跳過了遞
增表達(dá)式,所以遞增會(huì)在 i==3 的情況下直接執(zhí)行。在 i==7 的情況下,continue outer 語句也會(huì)到達(dá)循環(huán)頂
部,而且也會(huì)跳過遞增,所以它也是直接遞增的。
下面是輸出結(jié)果:
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 outer 語句,就沒有辦法在一個(gè)內(nèi)部循環(huán)里找到出外部循環(huán)的路徑。這是由于 break 本身只
能中斷最內(nèi)層的循環(huán)(對(duì)于 continue 同樣如此)。
當(dāng)然,若想在中斷循環(huán)的同時(shí)退出方法,簡(jiǎn)單地用一個(gè) return 即可。
下面這個(gè)例子向大家展示了帶標(biāo)簽的 break 以及 continue 語句在 while 循環(huán)中的用法:
//: LabeledWhile.java//Java's "labeled while" loop
public classLabeledWhile {public static voidmain(String[] args) {int i = 0;
outer:while (true) {
prt("Outer while loop");while (true) {
i++;
prt("i = " +i);if (i == 1) {
prt("continue");continue;
}if (i == 3) {
prt("continue outer");continueouter;
}if (i == 5) {
prt("break");break;
}if (i == 7) {
prt("break outer");breakouter;
}
}
}
}static voidprt(String s) {
System.out.println(s);
}
}///:~
同樣的規(guī)則亦適用于 while:
(1) 簡(jiǎn)單的一個(gè) continue 會(huì)退回最內(nèi)層循環(huán)的開頭(頂部),并繼續(xù)執(zhí)行。
(2) 帶有標(biāo)簽的 continue 會(huì)到達(dá)標(biāo)簽的位置,并重新進(jìn)入緊接在那個(gè)標(biāo)簽后面的循環(huán)。
(3) break 會(huì)中斷當(dāng)前循環(huán),并移離當(dāng)前標(biāo)簽的末尾。
(4) 帶標(biāo)簽的 break 會(huì)中斷當(dāng)前循環(huán),并移離由那個(gè)標(biāo)簽指示的循環(huán)的末尾。
這個(gè)方法的輸出結(jié)果是一目了然的:
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
大家要記住的重點(diǎn)是:在 Java 里唯一需要用到標(biāo)簽的地方就是擁有嵌套循環(huán),而且想中斷或繼續(xù)多個(gè)嵌套級(jí)
別的時(shí)候。
在 Dijkstra 的“Goto 有害”論中,他最反對(duì)的就是標(biāo)簽,而非 goto 。隨著標(biāo)簽在一個(gè)程序里數(shù)量的增多,
他發(fā)現(xiàn)產(chǎn)生錯(cuò)誤的機(jī)會(huì)也越來越多。標(biāo)簽和 goto 使我們難于對(duì)程序作靜態(tài)分析。這是由于它們?cè)诔绦虻膱?zhí)行
流程中引入了許多“怪圈”。但幸運(yùn)的是,Java 標(biāo)簽不會(huì)造成這方面的問題,因?yàn)樗鼈兊幕顒?dòng)場(chǎng)所已被限
死,不可通過特別的方式到處傳遞程序的控制權(quán)。由此也引出了一個(gè)有趣的問題:通過限制語句的能力,反
而能使一項(xiàng)語言特性更加有用。
---------------------
作者:淡紫色呼吸
來源:CSDN
原文:https://blog.csdn.net/jinghuayuanli/article/details/16844765
總結(jié)
以上是生活随笔為你收集整理的java continue goto_Java中goto和break、continue实现区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ListMap排序
- 下一篇: Hadoop RPC框架