高級編程語言為什麼還要保留goto這樣的語法?

韋福勝


goto語句在結構化編程的今天,的確不再推廣,因為大量使用goto語句,使得程序可讀性非常差,邏輯上也容易出錯。

微軟在vc推出時,提出了結構化程序的概念。即,儘可能使用子程序。每一個子程序完成一個小的功能,按順序,就象寫文章一樣,條理清楚,可讀性強,便於維護。

但是,任何事情都有例外。

1,與老的軟件兼容。我們做的軟件,有很多是從上世紀繼承而來。如底層的差分,積分,語法語義的解析,已經是成熟的模塊了。現在要再用到系統中,如果編繹器不支持goto,必須重新編輯,出bug的可能性又增加了。

2,編程還有一個規則,即每個子程序,只在結尾返回,儘可能少在中間位量用return。這樣容易漏掉象free內存,或者Release老的mPen這樣的錯誤,導致系統崩潰。所以,在中間return,又要處理一個公共程序塊,用goto就比較完美。如:

void calculateafun()

{

int a,b,c,d;

char *p=new char[10000];

if(a==b)

{

.....大於1000行程序,有幾十個return

//有很多分枝要return,但須先free(p)

//加goto CommonProcess;

else

{

.......大於1000行,有幾十個return,

//同樣很多return,也要先釋放p.

//加goto CommonProcess;

}

CommonProcess:

free(p)

return;

}

當然,有點牽強,只是為了後期維護時,好替換。





beijingwanger


凡事無絕對,任何技術都有適合它的場景。技術用好了就是寶刀,用爛了就是炸彈。

技術沒有好與壞,主要在於用它的人,也就是程序員的水平。

並不能把goto當成絕對不能用的東西,比如c語言中用goto實現類似高級語言中的try finally 資源回收就非常常見。

再比如,c#中非常優秀(被nodejs等很多直接抄襲)的async、await就是在底層被編譯器生成了使用goto實現的狀態機,代碼見圖。


楊中科


現在高級語言程序員都不關注計算機最底層的東西了,以前的程序員對計算機和操作系統的基礎功底要求還是蠻高的,使用goto還有指針特別方便,但是需要程序員控制它的收放,現在高級語言把這塊要不給禁了,要不垃圾回收給你做了。


牛叉plus


其他的邏輯跳轉都是goto的包裝,它們都可以簡化代碼邏輯,但是不可完全替代goto,畢竟goto是可以無條件跳轉到任何地方的。

比如一個深層循環,想要一下跳出來,不用goto得用無數個break。

所以不能因噎廢食。

當然你自己可以約束自己,為了可讀性,儘量不用稀奇古怪的goto。


狂歡的聖誕0


短程序goto確實還挺好用,但是一旦代碼一長,問題一複雜,goto就不好用了,會使代碼查錯還是可讀性都下降


夕顏ie


goto 是最高效的跳轉語句 編程的核心就是各類跳轉


陳劍波32


這問題真沒意義。只想隨口說一句,goto是最接近彙編/機器碼的語句。高級語言為了保護傻瓜程序員,反而擯棄了很多彙編裡的高效跳轉。


eexpss


如果你想在一個複雜的邏輯裡想直接跳出,goto無疑是最好的選擇。


用戶61182426492775


多層循環的時候你就知道goto有多好用了。而且加殼時用goto代替return跳到殼結束標記有多好用了


CoffeeBoy


系統級編程指令,沒有他一些特殊的事情是無法實現的,比如:跳轉~


分享到:


相關文章: