深入理解goto語(yǔ)句的替代實(shí)現(xiàn)方式分析
更新時(shí)間:2013年05月23日 11:14:18 作者:
本篇文章是對(duì)goto語(yǔ)句的替代實(shí)現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
曾幾何時(shí),goto是多么的讓牛人綻放他們高超的精湛技術(shù)
曾幾何時(shí),goto又變成了萬(wàn)惡之首
曾幾何時(shí),goto只在教科書中的示例才會(huì)出現(xiàn)
有太多的理由不讓用goto,但有時(shí),我們又想使用goto的功能,怎么辦?
用try/catch/finally便可實(shí)現(xiàn)同等于goto的功能,來(lái)看二個(gè)示例:
try {
// operation one
if (failed) {
throw Exception;
}
// operation two
if (failed) {
throw Exception;
}
// operation three
if (failed) {
throw Exception;
}
} catch (Exception e) {
// do something when cases failed
}
和:
try {
// operation one
if (failed) {
return;
}
// operation two
if (failed) {
return;
}
// operation three
if (failed) {
return;
}
} finally {
// do something when failed
}
以上二段都等同于:
// operation one
if (failed) {
goto when_failed;
}
// operation one
if (failed) {
goto when_failed;
}
// operation one
if (failed) {
goto when_failed;
}
when_failed:
// do something when failed
用異常的方式有些暴力,但確實(shí)能正確的幫助實(shí)現(xiàn)類似goto的功能;用return和finally雖不是很暴力,但是比較難控制,因?yàn)樯婕暗絩eturn語(yǔ)句,它會(huì)在finally塊執(zhí)行后得以執(zhí)行,所以如果不想退出程序的話,這個(gè)方法還不如用異常來(lái)控制。
另外,break, continue也是比較強(qiáng)大的跳轉(zhuǎn)語(yǔ)句,特別是break label和continue label,可以跳出一層循環(huán)或是多層循環(huán); 但是要注意一點(diǎn)的是break只能在循環(huán)語(yǔ)句和switch語(yǔ)句中使用,continue只能在循環(huán)語(yǔ)句中使用。所以它們的局限性也很大。
這個(gè)小示例說(shuō)明,goto不單單是一個(gè)語(yǔ)句,它是一種解決問(wèn)題的思路和編程習(xí)慣,習(xí)慣了它的人,或者是想用它的人,即使不用goto也會(huì)寫出類似goto邏輯出來(lái)。它的優(yōu)點(diǎn)是會(huì)更容易的幫助找出解決方案。它的缺點(diǎn)也是眾人皆知。但我們要避免的不單單是一個(gè)goto語(yǔ)句,而是這種“跳轉(zhuǎn)式”的解決思路和編程習(xí)慣。
曾幾何時(shí),goto又變成了萬(wàn)惡之首
曾幾何時(shí),goto只在教科書中的示例才會(huì)出現(xiàn)
有太多的理由不讓用goto,但有時(shí),我們又想使用goto的功能,怎么辦?
用try/catch/finally便可實(shí)現(xiàn)同等于goto的功能,來(lái)看二個(gè)示例:
復(fù)制代碼 代碼如下:
try {
// operation one
if (failed) {
throw Exception;
}
// operation two
if (failed) {
throw Exception;
}
// operation three
if (failed) {
throw Exception;
}
} catch (Exception e) {
// do something when cases failed
}
和:
復(fù)制代碼 代碼如下:
try {
// operation one
if (failed) {
return;
}
// operation two
if (failed) {
return;
}
// operation three
if (failed) {
return;
}
} finally {
// do something when failed
}
以上二段都等同于:
復(fù)制代碼 代碼如下:
// operation one
if (failed) {
goto when_failed;
}
// operation one
if (failed) {
goto when_failed;
}
// operation one
if (failed) {
goto when_failed;
}
when_failed:
// do something when failed
用異常的方式有些暴力,但確實(shí)能正確的幫助實(shí)現(xiàn)類似goto的功能;用return和finally雖不是很暴力,但是比較難控制,因?yàn)樯婕暗絩eturn語(yǔ)句,它會(huì)在finally塊執(zhí)行后得以執(zhí)行,所以如果不想退出程序的話,這個(gè)方法還不如用異常來(lái)控制。
另外,break, continue也是比較強(qiáng)大的跳轉(zhuǎn)語(yǔ)句,特別是break label和continue label,可以跳出一層循環(huán)或是多層循環(huán); 但是要注意一點(diǎn)的是break只能在循環(huán)語(yǔ)句和switch語(yǔ)句中使用,continue只能在循環(huán)語(yǔ)句中使用。所以它們的局限性也很大。
這個(gè)小示例說(shuō)明,goto不單單是一個(gè)語(yǔ)句,它是一種解決問(wèn)題的思路和編程習(xí)慣,習(xí)慣了它的人,或者是想用它的人,即使不用goto也會(huì)寫出類似goto邏輯出來(lái)。它的優(yōu)點(diǎn)是會(huì)更容易的幫助找出解決方案。它的缺點(diǎn)也是眾人皆知。但我們要避免的不單單是一個(gè)goto語(yǔ)句,而是這種“跳轉(zhuǎn)式”的解決思路和編程習(xí)慣。
您可能感興趣的文章:
- cmd goto命令 流程跳轉(zhuǎn)
- 批處理中常用命令介紹(Echo、rem、goto、call、pause、if、for)
- cmd批處理 goto call命令使用說(shuō)明
- PHP goto語(yǔ)句簡(jiǎn)介和使用實(shí)例
- dos 流程跳轉(zhuǎn) goto
- js控制的回到頁(yè)面頂端goTop的代碼實(shí)現(xiàn)
- Go語(yǔ)言流程控制之goto語(yǔ)句與無(wú)限循環(huán)
- asp.net中引用同一個(gè)項(xiàng)目中的類庫(kù) 避免goToDefinition時(shí)不能到達(dá)真正的定義類
- php5.3 goto函數(shù)介紹和示例
- C++跳轉(zhuǎn)語(yǔ)句之Goto對(duì)變量定義的影響詳解
相關(guān)文章
CreateCompatibleDC()函數(shù)案例詳解
這篇文章主要介紹了CreateCompatibleDC()函數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Visual Studio Code運(yùn)行程序時(shí)輸出中文成亂碼問(wèn)題及解決方法
這篇文章主要介紹了解決Visual Studio Code運(yùn)行程序時(shí)輸出中文成亂碼問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
C語(yǔ)言宏函數(shù)container of()簡(jiǎn)介
這篇文章介紹了C語(yǔ)言宏函數(shù)container of(),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
C語(yǔ)言輾轉(zhuǎn)相除法求2個(gè)數(shù)的最小公約數(shù)
輾轉(zhuǎn)相除法最大的用途就是用來(lái)求兩個(gè)數(shù)的最大公約數(shù)。下面通過(guò)本文給大家介紹C語(yǔ)言輾轉(zhuǎn)相除法求2個(gè)數(shù)的最小公約數(shù),非常不錯(cuò),感興趣的朋友一起看看吧2016-12-12
C語(yǔ)言static修飾函數(shù)詳細(xì)解析
以下是對(duì)C語(yǔ)言中的static修飾函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08
include包含頭文件的語(yǔ)句中,雙引號(hào)和尖括號(hào)的區(qū)別(詳解)
下面小編就為大家?guī)?lái)一篇include包含頭文件的語(yǔ)句中,雙引號(hào)和尖括號(hào)的區(qū)別(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
C語(yǔ)言實(shí)現(xiàn)紙牌游戲(小貓釣魚)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)紙牌游戲,小貓釣魚游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10

