看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
shyangs:謝謝。 01/29 14:11
loveme00835:剛發現你這是會回溯的, 這樣的話 i 加個條件遞減即可 01/29 14:16
diabloevagto:那個using 跟 typedef是一樣的意思? 01/29 14:40
diabloevagto:要到退就把i-1改成--i 01/29 14:42
diabloevagto:不對...好像沒這麼單純,另外wihle有點問題 01/29 14:44
diabloevagto:如果i=0,i-1會變負的 01/29 14:44
※ 編輯: loveme00835 來自: 140.121.197.115 (01/29 16:13)
EdisonX:@dia~ 那個 using 就是 typedef , C++11 支援 01/29 19:46
EdisonX:( 話說 C++ Primer 5e 對於 C++11 寫得其實蠻好的 ) 01/29 19:47
maerdimer:那個 using 好酷 XD 01/29 22:49
diabloevagto:@E大,thx 01/30 00:26
diabloevagto:感覺用using 比用 typedef好,多了個=就好看很多 01/30 00:28