什么是goto語(yǔ)句
Goto語(yǔ)句在C語(yǔ)言中稱為跳轉(zhuǎn)語(yǔ)句。用于無(wú)條件跳轉(zhuǎn)到其他標(biāo)簽。它將控制權(quán)轉(zhuǎn)移給程序的其他部分。
Goto語(yǔ)句很少使用,因?yàn)樗钩绦虻目勺x性和復(fù)雜性變差。
語(yǔ)法
轉(zhuǎn)到標(biāo)簽;
Goto語(yǔ)句示例
讓我們看一個(gè)簡(jiǎn)單的例子來(lái)演示如何在C語(yǔ)言中使用goto語(yǔ)句。
打開(kāi)Visual Studio創(chuàng)建一個(gè)名為:goto的項(xiàng)目,并創(chuàng)建一個(gè)源文件:goto-statement . c在這個(gè)項(xiàng)目中,代碼如下-
#include <。stdio.h>。void main { int age
你沒(méi)有資格投票);
printf("輸入你的年齡:");scanf("%d ",& amp年齡);if(年齡& lt18){ goto goto label;}else {printf("您有資格投票!");}
}
執(zhí)行上述代碼,并獲得以下結(jié)果
你沒(méi)有資格投票!輸入您的年齡:12您沒(méi)有資格投票!輸入您的年齡:18歲您有資格投票!
為什么這么冷門?
二十年前,計(jì)算機(jī)編程還處于起步階段,程序流程是由“GOTO”語(yǔ)句控制的。這種語(yǔ)句允許程序員中斷當(dāng)前代碼行,直接轉(zhuǎn)到另一個(gè)不同的代碼段。清單1是一個(gè)簡(jiǎn)單的例子。
帶功能的控制流
維基百科的解釋是GOTO語(yǔ)句一直是批評(píng)和爭(zhēng)論的對(duì)象,主要的負(fù)面影響是使用GOTO語(yǔ)句使程序可讀性變差,甚至成為可維護(hù)的“面條代碼”。從20世紀(jì)60年代到70年代,隨著結(jié)構(gòu)化編程變得越來(lái)越流行,許多計(jì)算機(jī)科學(xué)家得出結(jié)論,程序應(yīng)該總是使用被稱為“結(jié)構(gòu)化”控制流的命令,例如循環(huán)和if-then-else語(yǔ)句,而不是GOTO。
甚至在今天,許多編程風(fēng)格的編碼標(biāo)準(zhǔn)都禁止使用GOTO語(yǔ)句。GOTO語(yǔ)句的捍衛(wèi)者認(rèn)為GOTO語(yǔ)句的有限使用不會(huì)導(dǎo)致低質(zhì)量的代碼,并聲稱在很多編程語(yǔ)言中,有些任務(wù)不使用一個(gè)或多個(gè)GOTO語(yǔ)句是無(wú)法直接實(shí)現(xiàn)的。比如有限狀態(tài)自動(dòng)機(jī)的實(shí)現(xiàn),跳出嵌套循環(huán),異常處理。
對(duì)后藤最著名的批評(píng)可能是艾茲格·迪科斯徹在1968年發(fā)表的一篇題為“后藤聲明的有害理論”的論文。[2] Dijiestra認(rèn)為GOTO語(yǔ)句的無(wú)限制使用應(yīng)該從高級(jí)語(yǔ)言中廢除,因?yàn)樗狗治龊万?yàn)證程序正確性的任務(wù)變得復(fù)雜(特別是涉及循環(huán))。
另一個(gè)觀點(diǎn)出現(xiàn)在高德納的結(jié)構(gòu)化編程與GOTO語(yǔ)句[3]。本文分析了許多常見(jiàn)的編程任務(wù),然后發(fā)現(xiàn)其中一些會(huì)通過(guò)使用Goto得到最理想的結(jié)構(gòu)。
這些批評(píng)在一些編程語(yǔ)言的設(shè)計(jì)中發(fā)揮了作用。雖然Ada的設(shè)計(jì)者在20世紀(jì)70年代末就意識(shí)到了goto的批評(píng),但是這個(gè)語(yǔ)句還是被包括在內(nèi),主要是為了支持GOTO語(yǔ)句必要代碼的自動(dòng)生成。
[4]但是,作為goto語(yǔ)句目的地的標(biāo)簽必須用雙尖括號(hào)括起來(lái)(例如,
此外,還有許多不同的語(yǔ)言形式可以視為goto的變形:
受限GOTO
很多語(yǔ)言,比如C語(yǔ)言和Java,都提供了相關(guān)的控制流語(yǔ)句,比如break和continue,這些都是有效受限的goto語(yǔ)句。它們的功能是無(wú)條件跳轉(zhuǎn),但它們只能跳轉(zhuǎn)到循環(huán)塊的末尾——繼續(xù)下一個(gè)循環(huán)或結(jié)束循環(huán)(中斷)
開(kāi)關(guān)/外殼結(jié)構(gòu)
C語(yǔ)言、C++和Java中的switch語(yǔ)句高效地實(shí)現(xiàn)了多通道goto,跳轉(zhuǎn)目標(biāo)由表達(dá)式的值來(lái)選擇。
這也導(dǎo)致我們沒(méi)有理由使用goto。
鑒于這些,goto的當(dāng)前用法如下:
goto語(yǔ)句的結(jié)果:goto語(yǔ)句在C/C++等高級(jí)編程語(yǔ)言中保留,但建議不要使用或少用。在一些較新的高級(jí)編程語(yǔ)言中,如Java,不提供goto語(yǔ)句。雖然指定goto為關(guān)鍵字,但不支持其使用,使得程序簡(jiǎn)潔易讀;但是后來(lái)的c#還是支持goto語(yǔ)句。goto語(yǔ)句的一個(gè)優(yōu)點(diǎn)是可以保證程序有唯一的出口,避免嵌套過(guò)大。
另一方面,goto語(yǔ)句不是提倡的,但肯定不是禁用的。那么在什么情況下可以使用goto語(yǔ)句呢?
考慮使用goto:
直接跳出多個(gè)循環(huán);
出現(xiàn)錯(cuò)誤時(shí)清除資源;
可以提高節(jié)目清晰度的環(huán)境。
無(wú)限制使用goto破壞了清晰的程序結(jié)構(gòu),使程序可讀性變差,甚至成為可維護(hù)的“面條代碼”。經(jīng)常會(huì)帶來(lái)錯(cuò)誤或者隱患,比如可能會(huì)跳過(guò)對(duì)象的構(gòu)造、變量的初始化、重要的計(jì)算等一些語(yǔ)句。
以下關(guān)于使用goto語(yǔ)句的原則可供讀者參考。
1)使用goto語(yǔ)句只能轉(zhuǎn)到同一個(gè)函數(shù),而不能從一個(gè)函數(shù)轉(zhuǎn)到另一個(gè)函數(shù)。
2)在同一個(gè)函數(shù)中使用goto時(shí),goto的起點(diǎn)應(yīng)該是函數(shù)中一個(gè)小函數(shù)的結(jié)束,goto的目的標(biāo)簽應(yīng)該是函數(shù)中另一個(gè)小函數(shù)的開(kāi)始。
3)在復(fù)雜的執(zhí)行狀態(tài)下不允許從goto到另一個(gè)位置,比如不允許從多個(gè)嵌套循環(huán)判斷中跳出。
4)應(yīng)避免雙向跳躍。這最有可能導(dǎo)致“面條碼”。
讀過(guò)linux內(nèi)核代碼的同學(xué)應(yīng)該注意到,在linux內(nèi)核代碼中很多地方實(shí)際上都使用了goto語(yǔ)句,但是你會(huì)發(fā)現(xiàn)它的使用非常謹(jǐn)慎,基本遵循了上面的原則。
﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
聲明:內(nèi)容是從互聯(lián)網(wǎng)上組織的,版權(quán)歸原作者所有。如果涉及到作品的版權(quán)問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們,謝謝!
你和丹尼爾工程師有什么區(qū)別?
加入技術(shù)交流小組,與專家面對(duì)面交流
向組中添加愛(ài)好者助手
1.《goto 為什么在C語(yǔ)言中,goto這么不受待見(jiàn)?》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《goto 為什么在C語(yǔ)言中,goto這么不受待見(jiàn)?》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/yule/1221792.html