3 回答

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

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