[問題] 這段程式碼如何改寫 避免goto

看板C_and_CPP (C/C++)作者 (厚呦)時間13年前 (2013/01/29 13:47), 編輯推噓8(808)
留言16則, 12人參與, 最新討論串1/2 (看更多)
問題(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

01/29 13:48, , 1F
程式短當然沒感覺,如果較長的你就會混亂了
01/29 13:48, 1F

01/29 13:49, , 2F
會跳來跳去,你要這樣作不如從新用call function
01/29 13:49, 2F
※ 編輯: shyangs 來自: 125.224.178.12 (01/29 14:05)

01/29 14:26, , 3F
http://codepad.org/iuBcXc7u 這樣可能可以吧
01/29 14:26, 3F

01/29 14:45, , 4F
這程式結構算是state machine,可以用enum取代標籤,再
01/29 14:45, 4F

01/29 14:46, , 5F
用switch來決定哪個state要做什麼
01/29 14:46, 5F

01/29 14:55, , 6F
state machine +1
01/29 14:55, 6F

01/29 15:07, , 7F

01/29 15:48, , 8F
do{func1();}while(!func2()||...!func5())???
01/29 15:48, 8F

01/29 16:26, , 9F
state machine +1
01/29 16:26, 9F

01/29 16:42, , 10F
http://codepad.org/ft3EDDh4 據說gcc可以玩tail call
01/29 16:42, 10F

01/29 16:54, , 11F
原來這樣改就行,樓上厲害
01/29 16:54, 11F

01/29 19:34, , 12F

02/01 01:58, , 13F
樓上這個不錯耶 這樣可以在程式部分的工法減少負擔@@
02/01 01:58, 13F

02/01 12:25, , 14F
我在學生時也聽過goto不好,但工作之後發現goto有他好用
02/01 12:25, 14F

02/01 12:25, , 15F
的地方
02/01 12:25, 15F

02/01 14:20, , 16F
用goto的時候感覺很像用禁術 蠻帥的
02/01 14:20, 16F
文章代碼(AID): #1H1s9wL3 (C_and_CPP)
文章代碼(AID): #1H1s9wL3 (C_and_CPP)