日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java中被搁置的“goto”保留字

發(fā)布時(shí)間:2025/3/21 java 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中被搁置的“goto”保留字 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

goto語句一直被人所詬病,說它使得代碼結(jié)構(gòu)復(fù)雜化,但是語言設(shè)計(jì)者們還是沒有放棄goto這個(gè)功能強(qiáng)大的語句。Java以面向?qū)ο笏Q也沒能夠放棄goto,而是把它當(dāng)做保留字,但是并未在語言中得到正式使用。

然而,從Java的break和continue這兩個(gè)關(guān)鍵字的身上,我們依然能夠看出一些goto的影子。

下面是《Thinking In Java 4th》中關(guān)于“goto”的介紹:

臭名昭著的“goto”

goto 關(guān)鍵字很早就在程序設(shè)計(jì)語言中出現(xiàn)。事實(shí)上,goto 是匯編語言的程序控制結(jié)構(gòu)的始祖:“若條件A,則跳到這里;否則跳到那里”。若閱讀由幾乎所有編譯器生成的匯編代碼,就會發(fā)現(xiàn)程序控制里包含了許多
跳轉(zhuǎn)。然而,goto 是在源碼的級別跳轉(zhuǎn)的,所以招致了不好的聲譽(yù)。若程序總是從一個(gè)地方跳到另一個(gè)地方,還有什么辦法能識別代碼的流程呢?隨著Edsger Dijkstra 著名的“Goto 有害”論的問世,goto 便從此
失寵。

事實(shí)上,真正的問題并不在于使用goto,而在于goto 的濫用。而且在一些少見的情況下,goto 是組織控制流程的最佳手段。

盡管goto 仍是Java 的一個(gè)保留字,但并未在語言中得到正式使用;Java 沒有g(shù)oto。然而,在break 和continue 這兩個(gè)關(guān)鍵字的身上,我們?nèi)匀荒芸闯鲆恍ゞoto 的影子。它并不屬于一次跳轉(zhuǎn),而是中斷循環(huán)語句的一種方法。之所以把它們納入goto 問題中一起討論,是由于它們使用了相同的機(jī)制:標(biāo)簽。

Java中的標(biāo)簽

“標(biāo)簽”是后面跟一個(gè)冒號的標(biāo)識符,就象下面這樣:
label1:

對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)簽使用,它們就會中斷到存在標(biāo)簽的地方。如下所示:

1 2 3 4 5 6 7 8 9 10 11 12 13 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án),并回到label1 處,但并不重新進(jìn)入循環(huán)。也就是說,它實(shí)際是完全中止了兩個(gè)循環(huán)。

代碼測試(java)

一下代碼均已在jdk1.6版本中測試通過

break語句測試

1 2 3 4 5 6 7 8 9 10 11 12 public static void testLabel() {for (int i = 0; i < 2; i++) {System.out.println("L1----"+i);for (int j = 0; j < 4; j++) {if (j == 2) {break;}System.out.println("--------L2---"+j);}} }

執(zhí)行結(jié)果:

1 2 3 4 5 6 L1----0 --------L2---0 --------L2---1 L1----1 --------L2---0 --------L2---1

這個(gè)代碼中break直接中斷內(nèi)部的for循環(huán)。

break+label語句測試

1 2 3 4 5 6 7 8 9 10 11 12 13 public static void testLabel3() { label1:for (int i = 0; i < 2; i++) {System.out.println("L1----"+i);for (int j = 0; j < 4; j++) {if (j == 2) {break label1;}System.out.println("--------L2---"+j);}} }

執(zhí)行結(jié)果:

1 2 3 L1----0 --------L2---0 --------L2---1

在這個(gè)代碼中break中斷標(biāo)簽label1處的外部for循環(huán)。

continue語句測試

1 2 3 4 5 6 7 8 9 10 11 public static void testLabel2() {for (int i = 0; i < 2; i++) {System.out.println("L1----"+i);for (int j = 0; j < 4; j++) {if (j == 2) {continue;}System.out.println("--------L2---"+j);}}}

執(zhí)行結(jié)果:

1 2 3 4 5 6 7 8 L1----0 --------L2---0 --------L2---1 --------L2---3 L1----1 --------L2---0 --------L2---1 --------L2---3

在這個(gè)代碼中continue中斷掉內(nèi)部的for循環(huán)后繼續(xù)執(zhí)行內(nèi)部for循環(huán)。

continue+label語句測試

1 2 3 4 5 6 7 8 9 10 11 12 13 public static void testLabel4() { label1:for (int i = 0; i < 2; i++) {System.out.println("L1----"+i);for (int j = 0; j < 4; j++) {if (j == 2) {continue label1;}System.out.println("--------L2---"+j);}} }

執(zhí)行結(jié)果:

1 2 3 4 5 6 L1----0 --------L2---0 --------L2---1 L1----1 --------L2---0 --------L2---1

在這個(gè)代碼中continue中斷掉內(nèi)部的for循環(huán)后繼續(xù)執(zhí)行跳到標(biāo)簽label1處的外部for循環(huán),繼續(xù)執(zhí)行。

Author:?crane-yuan

Link:?https://crane-yuan.github.io/2016/08/30/The-reserved-word-of-goto/

License:?知識共享署名-非商業(yè)性使用 4.0 國際許可協(xié)議

總結(jié)

以上是生活随笔為你收集整理的Java中被搁置的“goto”保留字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。