作者loveme00835 (高髮箍)
看板C_and_CPP
標題Re: [問題] 這段程式碼如何改寫 避免goto
時間Tue Jan 29 14:03:48 2013
※ 引述《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