break、continue、goto


break 可以離開目前 switchforwhiledo while 區塊,並前進至區塊後下一個陳述句,在 switch 主要用來結束陳述句進行至下一個 case 的比對,在 forwhiledo while,主要用於中斷目前的迴圈執行,如果 break 不是出現在 forwhile 迴圈或 switch 之中,會發生編譯錯誤,底下是個使用 break 的 for 例子:

for(int i = 1; i < 10; i++) {
    if(i == 5) {
        break;
    }

    cout << "i = " << i << endl;
}

continue 的作用與 break 類似,使用於迴圈,不同的是 break 會結束區塊的執行,而 continue 只會當次迴圈,並跳回迴圈區塊開頭繼續下一迴圈,而不是離開迴圈,例如上面的範例會顯示 i = 1 到 4,因為當 i 等於 5 時就會執行 break 而離開迴圈,再看下面這個程式:

for(int i = 1; i < 10; i++) {
    if(i == 5) {
        continue;
    }

    cout << "i = " << i << endl;
}

這段程式會顯示 1 到 4,與 6 到 9,當 i 等於 5 時,會執行 continue 直接結束此次迴圈,這次迴圈 cout 該行並沒有被執行,然後從區塊開頭頭執行下一次迴圈,所以 5 並沒有被顯示。

goto 是個很方便,但不被建議使用的語法,濫用的話會破壞程式的架構、使得程式難以閱讀,事實上,在完全不使用 goto 的情況下,也能撰寫程式。

goto 可以在程式中任意跳躍,跳躍前必須先設定好目的地,跳躍時必須指定目的地,例如:

START:
....
....
goto START;

其中 START 就是 goto 的一個目標標籤(Label),後面使用冒號,標籤可以出現在程式的任一個地方。

一個簡單的例子是這樣的:

#include <iostream> 
using namespace std; 

int main() { 

BEGIN: 
    int input = 0; 
    cout << "輸入一數:"; 
    cin >> input; 

    if(input == 0) {
        goto ERROR; 
    }

    cout << "100 / " << input 
         << " = " << 100.0 / input 
         << endl; 

    return 0; 

ERROR: 
    cout << "除數不可為 0" << endl; 
    goto BEGIN;
}

執行結果:

輸入一數:0
除數不可為 0
輸入一數:10
100 / 10 = 10

如果輸入 0,程式會跳至 ERROR 標籤然後顯示錯誤訊息,並重新跳至 BEGIN 標籤,然後再執行一次提示與輸入。

可想而知地,若隨意使用 goto,程式的邏輯馬上會變得混亂不堪,可以的話應避免使用,這個程式也可以如下撰寫:

#include <iostream> 
using namespace std; 

int main() { 
    int input; 

    do { 
        cout << "輸入一數:"; 
        cin >> input; 

        if(input) { 
            cout << "100 / " << input 
                 << " = " 
                 << 100.0 / input 
                 << endl;  
            break;
        } 

        cout << "除數不可為 0" << endl;

    } while(true);

    return 0; 
}