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

看板C_and_CPP作者 (高髮箍)時間11年前 (2013/01/29 14:03), 編輯推噓2(209)
留言11則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《shyangs (厚呦)》之銘言: : 問題(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): : 無。 重複執行 func1() 直到 func2() 回傳 true 為止, ... func2() 直到 func3() 回傳 true 為止, 每一行本身是一個 loop, 從上到下循序也是個 loop, 所以可以用 nested 結構: using Step = bool(*)(); Step steps[ 5 ] = { &func1, &func2, &func3, &func4, &func5 }; steps[0](); for( size_t i = 1; i < 5; ++i ) { while( !steps[i]() ) { steps[i-1](); } } goto 不是不好啦, 如果發現物件生命週期無法做到不重疊, 可讀性下降 的時候, 再去做改寫 EDIT: 修改為有回溯行為的版本 for( size_t i = 0; i < 5; ) { bool ret = steps[i](); if( !i || ret ) { ++i; } else { --i; } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

01/29 14:11, , 1F
謝謝。
01/29 14:11, 1F

01/29 14:16, , 2F
剛發現你這是會回溯的, 這樣的話 i 加個條件遞減即可
01/29 14:16, 2F

01/29 14:40, , 3F
那個using 跟 typedef是一樣的意思?
01/29 14:40, 3F

01/29 14:42, , 4F
要到退就把i-1改成--i
01/29 14:42, 4F

01/29 14:44, , 5F
不對...好像沒這麼單純,另外wihle有點問題
01/29 14:44, 5F

01/29 14:44, , 6F
如果i=0,i-1會變負的
01/29 14:44, 6F
※ 編輯: loveme00835 來自: 140.121.197.115 (01/29 16:13)

01/29 19:46, , 7F
@dia~ 那個 using 就是 typedef , C++11 支援
01/29 19:46, 7F

01/29 19:47, , 8F
( 話說 C++ Primer 5e 對於 C++11 寫得其實蠻好的 )
01/29 19:47, 8F

01/29 22:49, , 9F
那個 using 好酷 XD
01/29 22:49, 9F

01/30 00:26, , 10F
@E大,thx
01/30 00:26, 10F

01/30 00:28, , 11F
感覺用using 比用 typedef好,多了個=就好看很多
01/30 00:28, 11F
文章代碼(AID): #1H1sP6pv (C_and_CPP)
文章代碼(AID): #1H1sP6pv (C_and_CPP)