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

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闷盔,則跳到這里;否則跳到那里”旅急。若閱讀由幾乎所有編譯器生成的匯編代碼逢勾,就會(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 沒有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è)冒號(hào)的標(biāo)識(shí)符塌碌,就象下面這樣:
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)簽使用,它們就會(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)。

代碼測試(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

這個(gè)代碼中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

在這個(gè)代碼中break中斷標(biāo)簽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

在這個(gè)代碼中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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乙帮,隨后出現(xiàn)的幾起案子杜漠,更是在濱河造成了極大的恐慌,老刑警劉巖察净,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驾茴,死亡現(xiàn)場離奇詭異,居然都是意外死亡氢卡,警方通過查閱死者的電腦和手機(jī)沟涨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來异吻,“玉大人裹赴,你說我怎么就攤上這事【骼耍” “怎么了棋返?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雷猪。 經(jīng)常有香客問我睛竣,道長,這世上最難降的妖魔是什么求摇? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任射沟,我火速辦了婚禮殊者,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘验夯。我一直安慰自己猖吴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布挥转。 她就那樣靜靜地躺著海蔽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绑谣。 梳的紋絲不亂的頭發(fā)上党窜,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音借宵,去河邊找鬼幌衣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛壤玫,可吹牛的內(nèi)容都是我干的泼掠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼垦细,長吁一口氣:“原來是場噩夢啊……” “哼择镇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起括改,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腻豌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嘱能,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吝梅,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年惹骂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苏携。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡对粪,死狀恐怖右冻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情著拭,我是刑警寧澤纱扭,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站儡遮,受9級(jí)特大地震影響乳蛾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一肃叶、第九天 我趴在偏房一處隱蔽的房頂上張望蹂随。 院中可真熱鬧,春花似錦因惭、人聲如沸岳锁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浸锨。三九已至唇聘,卻和暖如春版姑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迟郎。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工剥险, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪肖。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓表制,卻偏偏與公主長得像,于是被迫代替她去往敵國和親控乾。 傳聞我的和親對象是個(gè)殘疾皇子么介,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

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