C或C+中的Gotos示例在這個(gè)線程中,我們將查看使用goto在C或C+中。它的靈感來自回答人們投票贊成是因?yàn)樗麄冋J(rèn)為我在開玩笑。摘要(標(biāo)簽從原版改為使意圖更加清晰):infinite_loop:
// code goes heregoto infinite_loop;為什么它比其他選擇更好:很具體。goto是導(dǎo)致無條件分支的語言結(jié)構(gòu)??蛇x方案取決于使用支持條件分支的結(jié)構(gòu),其條件總是退化的。標(biāo)簽記錄了意圖,沒有額外的注釋。讀者不必提前掃描中間的代碼breakS(盡管無原則的黑客仍然有可能模擬continue早早goto).規(guī)則:假裝守望者沒有贏。據(jù)了解,以上這些不能在實(shí)際代碼中使用,因?yàn)樗c已建立的成語背道而馳。假設(shè)我們都聽說過‘Goto認(rèn)為有害’,并知道Goto可以用來編寫意大利面代碼。如果你不同意一個(gè)例子,那么僅僅根據(jù)技術(shù)上的優(yōu)點(diǎn)來批評(píng)它(因?yàn)槿藗儾幌矚gGoto)并不是一個(gè)技術(shù)原因??纯次覀兡懿荒芟翊笕艘粯诱?wù)撨@件事。編輯這個(gè)問題似乎已經(jīng)解決了。它產(chǎn)生了一些高質(zhì)量的答案。感謝大家,尤其是那些認(rèn)真對(duì)待我的小循環(huán)榜樣的人。大多數(shù)懷疑論者都擔(dān)心缺乏封閉的范圍。正如@Quenmars在評(píng)論中指出的那樣,您始終可以在循環(huán)體周圍放置大括號(hào)。我順便注意到for(;;)和while(true)也不要給你免費(fèi)的支撐(而忽略它們可能會(huì)導(dǎo)致令人煩惱的錯(cuò)誤)。不管怎么說,我不會(huì)再把你的腦力浪費(fèi)在這件小事上了-我可以忍受那些無害的、習(xí)以為常的人。for(;;)和while(true)(如果我想保住我的工作,那也很好)??紤]到其他的反應(yīng),我看到很多人認(rèn)為goto你總是要用另一種方式重寫。當(dāng)然,你可以避免goto通過引入一個(gè)循環(huán),一個(gè)額外的標(biāo)志,一個(gè)嵌套的堆棧ifS,什么的,但為什么不考慮一下goto也許是這份工作最好的工具?換句話說,人們?yōu)榱吮苊馐褂脙?nèi)置的語言功能來達(dá)到預(yù)期的目的,準(zhǔn)備忍受多少丑陋?我的看法是,即使是添加國(guó)旗也要付出高昂的代價(jià)。我喜歡我的變量來表示問題或解決方案領(lǐng)域中的事物。為了避免goto“不會(huì)割傷的。我將接受第一個(gè)答案,它給出了分支到清理塊的C模式。國(guó)際海事組織,這是最有力的理由goto在所有張貼的答案,當(dāng)然,如果你衡量它的扭曲,一個(gè)仇人必須經(jīng)過,以避免它。
3 回答

慕萊塢森
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
void foo(){ if (!doA()) goto exit; if (!doB()) goto cleanupA; if (!doC()) goto cleanupB; /* everything has succeeded */ return;cleanupB: undoB();cleanupA: undoA();exit: return;}

翻過高山走不出你
TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
for ... for ... if(breakout_condition) goto final;final:

喵喔喔
TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
restart: if (system_call() == -1) { if (errno == EINTR) goto restart; // handle real errors }
- 3 回答
- 0 關(guān)注
- 336 瀏覽
添加回答
舉報(bào)
0/150
提交
取消