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

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

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

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

臭名昭著的“goto”

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

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

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

Java中的標簽

“標簽”是后面跟一個冒號的標識符,就象下面這樣:
label1:

對Java 來說,唯一用到標簽的地方是在循環(huán)語句之前。進一步說,它實際需要緊靠在循環(huán)語句的前方——在標簽和循環(huán)之間置入任何語句都是不明智的。而在循環(huán)之前設(shè)置標簽的唯一理由是:我們希望在其中嵌套另
一個循環(huán)或者一個開關(guān)。這是由于break 和continue 關(guān)鍵字通常只中斷當(dāng)前循環(huán),但若隨同標簽使用,它們就會中斷到存在標簽的地方。如下所示:

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 卻同時中斷內(nèi)部循環(huán)以及外部循環(huán),并移至label1 處。隨后,它實際是繼續(xù)循環(huán),但卻從外部循環(huán)開始。在條件4 中,break label1 也會中斷所有循環(huán),并回到label1 處,但并不重新進入循環(huán)。也就是說,它實際是完全中止了兩個循環(huán)。

代碼測試(java)

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

break語句測試

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é)果:

L1----0
--------L2---0
--------L2---1
L1----1
--------L2---0
--------L2---1

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

break+label語句測試

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é)果:

L1----0
--------L2---0
--------L2---1

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

continue語句測試

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é)果:

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

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

continue+label語句測試

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é)果:

L1----0
--------L2---0
--------L2---1
L1----1
--------L2---0
--------L2---1

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、順序結(jié)構(gòu) 代碼在執(zhí)行過程中如果沒有控制語句,代碼就會一句一句的執(zhí)行下去,直到結(jié)束。 二、選擇結(jié)...
    堅持也是一種成功閱讀 720評論 1 5
  • 第四章 控制執(zhí)行流程 1.關(guān)于goto Java并不支持goto語句,但在Java中仍然可以進行類似goto那樣的...
    FreeCode閱讀 443評論 0 0
  • 前言 軟件的使用上我一直有一種潔癖,一旦遇到帶有廣告和其他流氓行為的程序渾身不自在,有的時候不得不用它們就像吃了蒼...
    Dogged_Ivan閱讀 318評論 0 0
  • 愛情是兩個人的事,分手只需一個人的決定,致那些年我們逝去的愛情。 不久前,收到戀人發(fā)來了的一條信息,分手吧,我們不...
    安靜_等待閱讀 506評論 0 1
  • 決變 一個人一生可以活多少年,有多少年中都在做著抉擇,有多少選擇是做了又后悔了。 書上總說:人無遠慮必有近憂,可是...
    努力紅閱讀 381評論 0 0

友情鏈接更多精彩內(nèi)容