天天看點

C++ 中使用 goto 增強 break 和 continue

C++ 的 goto 語句在大多數時間是被打入冷宮的,就因為它容易使代碼晦澀難讀。同時,break 和 continue 又經常在多重循環中黔驢技窮——不能越層控制循環。

  Java 尚能如此,為何不在 C++ 中用标簽和 goto 語句模仿 Java 來增強 break 和 continue 的功能呢?

  于是照 Java 代碼寫了一份 C++ 的試驗樣例,結果第一次試驗失敗。代碼如下:

int main(int argc, char* argv[])  

...{  

    cout << "[begin>" << endl;  

continuei:  

    for (int i = 0; i < 10; i++) ...{  

        for (int j = 0; j < 5; j++) ...{  

            if ((i + j) % 5 == 0) ...{  

                cout << "continue i" <<endl;  

                goto continuei;  

            }  

            cout << i << ", " << j << endl;  

        }  

    }  

    cout << "<end]" << endl;  

這樣做的結果是死循環。每次 goto continuei 之後,就會重新執行第一個循環,是以造成了死循環。看來,隻能把标簽定義在緊接着循環結束符(},完成花括号)之前,于是又起一例。這次測試成功。代碼如下:

continuei: continue;  

不過,這裡如果 break 和 continue 同時出現的話,continue 應該放在前面。因為,如果循環過程中沒有觸發 goto 語句,這個循環在執行到本次循環結束的時候,是應該繼續下一次循環的。continue 定義在前面,就會先執行到它,也就會路過後面後 break 繼續下一次循環。返之,如果把 break 放在 continue 前面,則會跳過後面的 continue,跳出循環——這就違背了初衷。還是興趣個例子:

            if (i == 7 && j == 1) ...{  

                cout << "break i" << endl;  

                goto breaki;  

breaki: break;  

最後還是要說明一下,這個方法要慎用,因為多重循環本身就應該慎用的。多數需多重循環的代碼,都可以拆分成每個循環一個函數來替代。這樣做會讓代碼更易讀,但是也會降低程式的執行效率。

本文轉自邊城__ 51CTO部落格,原文連結:http://blog.51cto.com/jamesfancy/843230,如需轉載請自行聯系原作者