看板 C_and_CPP 關於我們 聯絡資訊
問題(Question): 我在寫一個小程式時,寫出底下這段程式碼。 常聽人說要避免使用goto, 那要如何改寫? 還是說這裡用goto也足夠清晰,可以接受? 程式碼(Code):(請善用置底文網頁, 記得排版) label_1: func1(); label_2: if( !func2() ){ goto label_1; } label_3: if( !func3() ){ goto label_2; } label_4: if( !func4() ){ goto label_3; } if( !func5() ){ goto label_4; } 補充說明(Supplement): 當func2()傳回否時,即 !func2()傳回真,我需要再執行一次func1(), 接著再判斷一次 func2()的真假值,再決定往回走,還是往下走。 (每次往回走,再往下走,真假值都可能改變) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.224.178.12
diabloevagto:程式短當然沒感覺,如果較長的你就會混亂了 01/29 13:48
diabloevagto:會跳來跳去,你要這樣作不如從新用call function 01/29 13:49
※ 編輯: shyangs 來自: 125.224.178.12 (01/29 14:05)
purpose:http://codepad.org/iuBcXc7u 這樣可能可以吧 01/29 14:26
shadow0326:這程式結構算是state machine,可以用enum取代標籤,再 01/29 14:45
shadow0326:用switch來決定哪個state要做什麼 01/29 14:46
azureblaze:state machine +1 01/29 14:55
linotwo:http://codepad.org/xXEpAkSF 01/29 15:07
leiyan:do{func1();}while(!func2()||...!func5())??? 01/29 15:48
abcsimps:state machine +1 01/29 16:26
littleshan:http://codepad.org/ft3EDDh4 據說gcc可以玩tail call 01/29 16:42
purpose:原來這樣改就行,樓上厲害 01/29 16:54
azaz12345:樓上這個不錯耶 這樣可以在程式部分的工法減少負擔@@ 02/01 01:58
cobrasgo:我在學生時也聽過goto不好,但工作之後發現goto有他好用 02/01 12:25
cobrasgo:的地方 02/01 12:25
issuemylove:用goto的時候感覺很像用禁術 蠻帥的 02/01 14:20