Re: [問題] 這段程式碼如何改寫 避免goto
※ 引述《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
01/29 14:16, 2F
→
01/29 14:40, , 3F
01/29 14:40, 3F
→
01/29 14:42, , 4F
01/29 14:42, 4F
→
01/29 14:44, , 5F
01/29 14:44, 5F
→
01/29 14:44, , 6F
01/29 14:44, 6F
※ 編輯: loveme00835 來自: 140.121.197.115 (01/29 16:13)
推
01/29 19:46, , 7F
01/29 19:46, 7F
→
01/29 19:47, , 8F
01/29 19:47, 8F
→
01/29 22:49, , 9F
01/29 22:49, 9F
→
01/30 00:26, , 10F
01/30 00:26, 10F
→
01/30 00:28, , 11F
01/30 00:28, 11F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):