你寫 C 的時候經常用 goto 語句嗎,為什麼?

時間 2021-05-05 19:18:30

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 生...

你是什麼時候喜歡上C羅的

羅納爾多 14年的世界盃,那3場帶傷出場的三場比賽,一己之力給德國製造壓力,面對美國5人包夾從容突破 對迦納,一次又一次對對方試壓。為了帶領葡萄牙出線。到最後也沒放棄 李李李 13 14歐冠半決賽次回合皇馬4 0拜仁那場,以前對C羅是欣賞的話,但那場比賽以後就徹底愛上了Quattroporte。那場...