小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

嵌入式C中,goto用得比較少?

 bdlsk 2022-01-03

什么是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ǔ)法
goto label;

goto語(yǔ)句示例

讓我們來(lái)看一個(gè)簡(jiǎn)單的例子,演示如何使用C語(yǔ)言中的goto語(yǔ)句。

打開(kāi)Visual Studio創(chuàng)建一個(gè)名稱為:goto的工程,并在這個(gè)工程中創(chuàng)建一個(gè)源文件:goto-statment.c,其代碼如下所示 -
#include <stdio.h> void main() { int age;
gotolabel: printf('You are not eligible to vote!\n');
printf('Enter you age:\n'); scanf('%d', &age); if (age < 18) { goto gotolabel; }else { printf('You are eligible to vote!\n'); }
}

執(zhí)行上面代碼,得到以下結(jié)果

You are not eligible to vote!Enter you age:12You are not eligible to vote!Enter you age:18You are eligible to vote!

為什么它這么不受待見(jiàn)?

二十幾年前,當(dāng)計(jì)算機(jī)編程尚處于起步階段時(shí),程序流程是由“GOTO”語(yǔ)句來(lái)控制。該類語(yǔ)句允許程序員對(duì)當(dāng)前代碼行斷行,而直接進(jìn)入另一個(gè)不同的代碼段。列表1為簡(jiǎn)單的示例。

圖片
使用GOTO語(yǔ)句
編程語(yǔ)言終究開(kāi)始引入了函數(shù)的概念,即允許程序?qū)Υa進(jìn)行斷行。如果已經(jīng)完成,不再使用goto語(yǔ)句來(lái)表示代碼的斷行。函數(shù)調(diào)用后,函數(shù)將回到下一條指令。列表2為示例。這一做法改善了程序結(jié)構(gòu),提高了可讀性。自此,這被視為編寫程序的正確方法。只要看到或想到goto語(yǔ)句,就會(huì)讓軟件工程師退縮,產(chǎn)生本能 的厭惡。其中一個(gè)主要的原因是,一個(gè)遍布goto語(yǔ)句的程序會(huì)讓讓人很難抓住重心,不便于對(duì)程序的理解和維護(hù)。

圖片
用函數(shù)控制流程
而wikipedia上的解釋就是,GOTO語(yǔ)句一直是批評(píng)和爭(zhēng)論的目標(biāo),主要的負(fù)面影響是使用GOTO語(yǔ)句使程序的可讀性變差,甚至成為不可維護(hù)的「面條代碼」。隨著結(jié)構(gòu)化編程在二十世紀(jì)六十年代到七十年代變得越來(lái)越流行,許多計(jì)算機(jī)科學(xué)家得出結(jié)論,即程序應(yīng)當(dāng)總是使用被稱為「結(jié)構(gòu)化」控制流程的命令,如迴圈以及if-then-else語(yǔ)句來(lái)替代GOTO。甚至在今天,許多程序風(fēng)格編碼標(biāo)準(zhǔn)禁止使用GOTO語(yǔ)句。

為GOTO語(yǔ)句辯護(hù)的人認(rèn)為,加以限制地使用GOTO語(yǔ)句不會(huì)導(dǎo)致低質(zhì)量的代碼,并且聲稱在許多編程語(yǔ)言中,一些任務(wù)如果不使用一條或多條GOTO語(yǔ)句是無(wú)法被直接實(shí)現(xiàn)的。如有限狀態(tài)自動(dòng)機(jī)的實(shí)現(xiàn)、跳出嵌套循環(huán)以及異常處理。
大概最著名的對(duì)于GOTO的批評(píng)是艾茲格·迪杰斯特拉(Edsger Wybe Dijkstra)在1968年的一篇名稱為《GOTO陳述有害論》的論文。[2]迪杰斯特拉認(rèn)為不加限制地使用GOTO語(yǔ)句應(yīng)當(dāng)從高級(jí)語(yǔ)言中廢止,因?yàn)樗狗治龊万?yàn)證程序正確性(特別是涉及循環(huán))的任務(wù)變得復(fù)雜。另外一種觀點(diǎn)出現(xiàn)在高德納的Structured Programming with go to Statements [3]中,文章分析了許多常見(jiàn)編程任務(wù),然后發(fā)現(xiàn)其中的一些使用GOTO將得到最理想的結(jié)構(gòu)。
這些批評(píng)在一些編程語(yǔ)言的設(shè)計(jì)上起到了效果。雖然Ada語(yǔ)言的設(shè)計(jì)者在二十世紀(jì)七十年代晚期意識(shí)到了對(duì)于GOTO的批評(píng),這條語(yǔ)句仍舊被包含進(jìn)去,主要是用來(lái)支持自動(dòng)生成那些goto語(yǔ)句必不可少的代碼。[4]但是,作為goto語(yǔ)句目的地的標(biāo)簽必須使用雙尖括號(hào)括起來(lái)(如:<<Start_Again>>),而這個(gè)語(yǔ)法在其他語(yǔ)言中都不被使用。這使得檢查程序中g(shù)oto目的地的存在變得容易。goto語(yǔ)句本身使用簡(jiǎn)單的形式goto Start_Again;.
另外,有許多不同的語(yǔ)言構(gòu)成可以看作是goto的變形:
限制的GOTO

許多語(yǔ)言,如C語(yǔ)言和Java,提供了相關(guān)的控制流語(yǔ)句,如break和continue,它們都是有效地被限制的goto語(yǔ)句。它們的作用是無(wú)條件跳轉(zhuǎn),但是只能夠跳到循環(huán)塊結(jié)束的位置——繼續(xù)進(jìn)入下一循環(huán)(continue)或者結(jié)束循環(huán)(break)

switch/case結(jié)構(gòu)

C語(yǔ)言、C++和Java中的switch語(yǔ)句高效地實(shí)現(xiàn)了一個(gè)多路goto,跳轉(zhuǎn)目標(biāo)由表達(dá)式的值來(lái)選擇。
這也導(dǎo)致了我們沒(méi)有不得不使用goto的理由。
針對(duì)這些,導(dǎo)致目前goto的使用情況是這樣的:
goto語(yǔ)句的結(jié)果:在C/C++等高級(jí)編程語(yǔ)言中保留了goto語(yǔ)句,但被建議不用或少用。在一些更新的高級(jí)編程語(yǔ)言,如Java不提供goto語(yǔ)句,它雖然指定goto作為關(guān)鍵字,但不支持它的使 用,使程序簡(jiǎn)潔易讀;盡管如此后來(lái)的c#還是支持goto語(yǔ)句的,goto語(yǔ)句一個(gè)好處就是可以保證程序存在唯一的出口,避免了過(guò)于龐大的if嵌套。
另一方面,goto語(yǔ)句只是不提倡,當(dāng)然不是禁用,那么在什么情況下可以使用goto語(yǔ)句呢?
可以考慮使用goto的情形:

  1. 從多重循環(huán)中直接跳出 ;
  2. 出錯(cuò)時(shí)清除資源;
  3. 可增加程序的清晰度的情況。
不加限制地使用goto:破壞了清晰的程序結(jié)構(gòu),使程序的可讀性變差,甚至成為不可維護(hù)的'面條代碼'。經(jīng)常帶來(lái)錯(cuò)誤或隱患,比如它可能跳過(guò)了某些對(duì)象的構(gòu)造、變量的初始化、重要的計(jì)算等語(yǔ)句。
下列關(guān)于使用goto語(yǔ)句的原則可以供讀者參考。

1) 使用goto語(yǔ)句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里?! ?/span>
2) 使用goto語(yǔ)句在同一函數(shù)內(nèi)進(jìn)行g(shù)oto時(shí),goto的起點(diǎn)應(yīng)是函數(shù)內(nèi)一段小功能的結(jié)束處,goto的目的label處應(yīng)是函數(shù)內(nèi)另外一段小功能的開(kāi)始處?! ?/span>
3) 不能從一段復(fù)雜的執(zhí)行狀態(tài)中的位置goto到另外一個(gè)位置,比如,從多重嵌套的循環(huán)判斷中跳出去就是不允許的?! ?/span>
4)應(yīng)該避免像兩個(gè)方向跳轉(zhuǎn)。這樣最容易導(dǎo)致'面條代碼'。
閱讀過(guò)linux內(nèi)核代碼的同學(xué)應(yīng)該注意到,linux內(nèi)核代碼里面其實(shí)有不少地方用了goto語(yǔ)句,但是你會(huì)發(fā)現(xiàn),它的使用非常謹(jǐn)慎,基本都遵循上面提到的幾個(gè)原則。
END

來(lái)源:網(wǎng)絡(luò)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多