3 回答

TA貢獻1834條經(jīng)驗 獲得超8個贊
我知道有一些使用“ goto”語句的原因(有些已經(jīng)講過):
干凈地退出功能
通常在函數(shù)中,您可能會分配資源,并且需要在多個位置退出。程序員可以通過將資源清除代碼放在函數(shù)的末尾來簡化其代碼,并且該函數(shù)的所有“退出點”都將進入清除標(biāo)簽。這樣,您不必在函數(shù)的每個“退出點”都編寫清除代碼。
退出嵌套循環(huán)
如果您處于嵌套循環(huán)中并且需要脫離所有循環(huán),那么goto可以比break語句和if-checks更加簡潔明了。
低級性能改進
這僅在性能至關(guān)重要的代碼中有效,但是goto語句執(zhí)行得非???,并且在遍歷函數(shù)時可以為您提供幫助。但是,這是一把雙刃劍,因為編譯器通常無法優(yōu)化包含gotos的代碼。
請注意,在所有這些示例中,gotos僅限于單個函數(shù)的范圍。

TA貢獻1865條經(jīng)驗 獲得超7個贊
由于goto
使程序流程難以進行推理1(又稱“意大利面條代碼”),goto
因此通常僅用于補償缺少的功能:使用goto
可能實際上是可以接受的,但前提是該語言沒有提供更結(jié)構(gòu)化的變體來獲取相同的目標(biāo)。以Doubt為例:
我們使用goto的規(guī)則是goto可以跳轉(zhuǎn)到函數(shù)中的單個出口清理點。
這是正確的-但前提是該語言不允許使用清理代碼(例如RAII或finally
)進行結(jié)構(gòu)化異常處理,這樣做的效果更好(因為它是專門為此目的而構(gòu)建的),或者在有充分理由不這樣做的情況下使用結(jié)構(gòu)化異常處理(但除非是非常低的級別,否則您永遠不會遇到這種情況)。
在大多數(shù)其他語言中,唯一可接受的用法goto
是退出嵌套循環(huán)。甚至在那里,將外部循環(huán)提升為自己的方法并改用它幾乎總是更好的選擇return
。
除此之外,這goto
表明沒有對特定代碼進行足夠的思考。
1支持的現(xiàn)代語言goto
實現(xiàn)了一些限制(例如,goto
可能不會跳入或跳出功能),但問題從根本上保持不變。
順便說一句,其他語言功能當(dāng)然也是如此,最明顯的例外是。而且通常有嚴(yán)格的規(guī)則來僅在指示的地方使用這些功能,例如不使用異常來控制非異常程序流的規(guī)則。
- 3 回答
- 0 關(guān)注
- 749 瀏覽
添加回答
舉報