1樓:Wanna
正常情況下,不使用goto語句。
正確用好break, continue 語句!
break 是結束整個迴圈
continue 是結束本次迴圈
可以關注C/C++專欄:https://
zhuanlan /c_1173683445720043520
2樓:Doraemon
跳出多重迴圈可以通過設定 flag 或封裝成函式的方法來避免 goto。而且個人覺得如果迴圈巢狀超過三層了那就真的是架構有問題了。
對於其他的異常判斷,看似必用 goto 解決的,其實也有辦法不用 goto 解決。
比如這樣的if(
cond1
)// if (cond1)
// Something 1if(
cond2
)// if (cond2)
// Something 2
onDestroy://
Something
3我們把條件反一下if(
!cond1
)// if (!cond1)
elseif(
!cond2
)// else if (!cond2)
//Something
3這樣豈不是更優雅。
另外再說一些我個人覺得不好的習慣。很多人在函式裡面會把防熊孩子類的判斷放在最前面,然後加個 return,再之後才是傳入引數符合預期時的操作。比如這樣子的:
void
foo(
intbar
)// if (bar == 0)
// Do something}//
foo()
前一種習慣其實是有 goto 的影子的(void 函式中的 return)。我更喜歡這樣寫
void
foo(
intbar
)// if (bar != 0)
else
//else
把習慣養好了,你就不會動不動就想要用 goto 來解決問題了。
3樓:鄭小信
每次看到這個問題總想說
CPython原始碼充斥著goto 233333https://
h可以拿來當正反方的論據哦。
4樓:子猫
把多層迴圈弄到乙個臨時lambda中去,就可以避免在多層迴圈中使用goto。
既然寫c++,就不要使用goto了,goto對RAII很不友好。
...forforif(condition)goto outout:
改寫...
auto tmpfun = [&]() {forforif(conditionreturntmpfun();...
5樓:嚴駿
在我剛學程式設計那些年,似乎是basic還是啥,記不清了,用goto用的飛起,後來呢,有什麼感覺呢,用goto你就是這個程式的主宰,你可以控制它,想怎麼控制就怎麼控制,但整個程式慢慢變大以後,你就不能這麼細緻地去控制了,就好比,你管乙個10,20人的團隊可以面面俱到,按人頭去管理,事事過問,但等人多到100,200,1000,2000等到人數到了幾十萬的時候,你就必須設立機構,用組織去管理它,你不能,也沒有精力,也沒能力去做那個面面俱到,關心到細枝末節的主宰了,你就必須用結構化地程式結構去做這些。
6樓:tearshark
既然是C++,那必然不常用啊。因為C++的習慣是隨用隨申明,而goto會破壞這種變數的析構順序。故C++不允許goto區塊間申明變數。這樣的一來,自然就不怎麼用goto了。
況且,do{}while(false)也挺好用的啊。
7樓:Axis816
goto在c語言設計之初就存在必然有其存在的道理之所以有些專案禁用goto其實是(擔心)專案成員濫用,說到底是成員水平責任心問題,專案leader管控力問題,採取簡單禁用來迴避問題而已
去看看久經考驗c實現的底層庫,有不少goto確實達到了更加可讀更加簡潔的目的,goto用的恰到好處
所以goto沒問題,是水平問題,甚至是專案把控問題
8樓:「已登出」
我來分享下goto的另乙個場景吧
bool initAllbool ret = false初始化ABCD
ret = init(A);
if (!ret) goto _A;
ret = init(B); // 初始化B要保證A存在if (!ret) goto _B;
ret = init(C);
if (!ret) goto _C;
ret = init(D);
if (!ret) goto _Dreturn ret;
_DD.delete();
_CC.delete();
_BB.delete();
_AA.delete();
return ret;}
9樓:
《C++ Primer 5e》明確建議不要再程式中使用goto語句。因為這樣會使程式結構混亂,降低程式的可讀性。
因此,我到目前為止沒有使用過。估計以後除非非用不可,我應該不會去用(這種情況應該不多)。
10樓:嘿-姑娘
用c11模擬乙個類似golang的defer 大多數goto可以用 do while. break模擬。放棄goto吧
11樓:李李
如果goto沒用的話,那它就不會存在了。剛入行的時候也曾聽信什麼goto禁用,現在不糾結了,該用就用,用在正確的地方就行了。貌似,try catch就是個大大的goto
12樓:Juanjie Xi
如果程式裡用到了類似 do...while(0) 這種 work around ,還不如老老實實 goto。
一定不想用的話就應該從程式結構上下手,從根本解決問題。
13樓:
跳出多層迴圈也沒必要用goto,多加乙個標記變數的判斷能對效能有多大影響?
很多時候goto只需要在乙個函式體內,但label的作用域是全域性的,因為這個我就寧願用lamda做資源統一釋放
14樓:暗黑謝廣坤
C的時候用來做錯誤跳轉、多層巢狀跳出什麼的,C艹的時候還是盡量別用了,有異常可以用,C艹本身的特性決定了用goto會帶來很多麻煩。
樓上某些無責任把goto批判一番的,不知道是老師原話原教旨主義還是課本原話原教旨主義,連goto數量與水平成反比這種話都能說出來(根本沒指出語言環境就把goto批判一番),可笑啊,將來在宣傳上出了偏差,他等於,他也有這個責任吧!
15樓:梨梨喵
func
()//...if(
error1_occur
)//...
returnh;
err_exit
:CloseHandle(h
);return
nullptr;}
在有了C++11 lambda後, 可以交給RAII來管理了, goto在這種情景下使用的意義並不大了.
class
ScopeGuard
~ScopeGuard()}
void
Dismiss
(bool
dismissed
=true
)ScopeGuard
(ScopeGuard
const&)
=delete
;ScopeGuard
&operator=(
ScopeGuard
const&)
=delete
;// non-copyable
private
:std
::function
()>__onExit ;bool __dismissed;}; HANDLE func ()); //...if( error0_occur )//...if( error1_occur )//... onErrorExit .Dismiss ()// no error occur returnh; }另一點, 在關於效能方面goto在VM上有一定作用 如乙個簡單的指令迴圈如下: while (byte_code .size ()>IP) case BYTE_CODE ::INSTRUCTION_1 :case BYTE_CODE ::INSTRUCTION_2 ://... //more cases}} 這麼寫的話在switch和while上出現了至少兩個分支語句, 一次指令迴圈中要進行一次條件跳轉和三次無條件跳轉(開啟switch跳轉表優化後) 在使用goto語句後可以大大減少在這些控制語句上的效能消耗, 配合GCC的拓展Labels as Values使用. static const void *next_instr =switch (byte_code[IP ])//for initial instruction case BYTE_CODE ::INSTRUCTION_0 :case BYTE_CODE ::INSTRUCTION_1 :case BYTE_CODE ::INSTRUCTION_2 ://... //more cases }在指令流結束的位置插入一條halt指令表示終止. 這樣就一次指令迴圈中只有一次無條件跳轉. 效能上能獲得一定的提高. 之前在我自己寫VM的時候做profile, 發現在switch和while上至少消耗了12%的效能, 改用goto後獲得了7%的效能的提公升. 在這一點上goto還是有一定的意義的. 16樓: 首先承認 goto確實很快在彙編裡面就是一行 jmp 的事情但其實只要是邏輯跳轉分支 if for while break continue 之類也都是jmp啊所以談不上效率 而且滿屏goto你看得懂嗎 17樓:Andy Wan 當年用fortran的時候乙個程式裡有乙個goto語句,然後因為這個goto我除錯的時候倍痛苦。現在cpp我無論如何不會再用這個! 18樓:陳晨 用啊,有一種程式設計模板叫做」錯誤/異常處理彙總(error/exception handling merge)", 在C類的查返回值的錯誤處理比較常用。 一有異常都跳到乙個統一的error出口,然後查返回值來做相應處理,主要是釋放資源。 19樓: 我以前用C寫Tcl/tk擴充套件,乙個列車動力學的計算引擎的時候在入口函式用過大量goto,具體原因不記得了,只是當時覺得這樣可讀性和效能都會好些。 20樓:孫思傑 私以為,為了寫出精煉易懂高效的程式,任何語言元素都可以使用,但是正是因為要讓程式精煉易懂高效,所以絕大多數情況下避免使用goto。 21樓:Lyken 個人而言,僅在以下情況謹慎使用goto四五層迴圈內進行跳轉的時候。 狀態機之間切換(現在可以用尾遞迴等方式實現,已經沒必要用goto)。 goto現在更像是為了更方便實現某種需求而保留下來的奇淫技巧,而不是什麼提公升程式效能的手段。如果真需要為省一點邏輯判斷而用goto,估計是硬體層面的程式設計,你應該採用C + 彙編。 啟達核桃老師 01 讓我怎樣感謝你 當我走向你的時候 我原想收穫一縷春風 你卻給了我整個春天 感謝 汪國真 02 願所有的幸福都追隨著你 仰首是春,俯首是秋 願所有的快樂都陪伴著你 月圓是畫,月缺是詩 旅行 汪國真 03 我不去想是否能夠成功 既然選擇了遠方 便只顧風雨兼程 我不去想身後會不會襲來寒... 畫船聽雨眠 滿滿乾貨南濱贈你30句請收藏好!Thanks 1 沒有可怕的深度,就沒有美麗的水面。尼采 2 不必行色匆匆,不必光芒四射,不必成為別人,只需做自己。維吉尼亞 伍爾夫 3 所謂無底深淵,下去,也是前程萬里。素履之往 4 只有用水將心上的霧氣淘洗乾淨,榮光才會照亮最初的夢想。百年孤獨 5 生... 羅納爾多 14年的世界盃,那3場帶傷出場的三場比賽,一己之力給德國製造壓力,面對美國5人包夾從容突破 對迦納,一次又一次對對方試壓。為了帶領葡萄牙出線。到最後也沒放棄 李李李 13 14歐冠半決賽次回合皇馬4 0拜仁那場,以前對C羅是欣賞的話,但那場比賽以後就徹底愛上了Quattroporte。那場...你寫作文經常用的名言有哪些?
你寫作文經常用的句子有哪些?
你是什麼時候喜歡上C羅的