break、continue、goto


break可以離開目前switch、for、while、do while的區塊,並前進至區塊後下一個陳述句,在switch中主要用來結束陳述句進行至下一個case的比對,在for、while與do while中,主要用於中斷目前的迴圈執行,如果break出現並不是內含在for、while迴圈中或switch陳述中,則會發生編譯錯誤, break的例子我們之前看過不少,這邊不再舉例。

continue的作用與break類似,主要使用於迴圈,所不同的是break會結束區塊的執行,而continue只會結束接下來區塊中的陳述句,並 跳回迴圈區塊的開頭繼續下一個迴圈,而不是離開迴圈,例如:
for(int i = 1; i < 10; i++) {
    if(i == 5)
        break;

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

這段程式會顯示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是一個很方便,但是最不被建議使用的語法,濫用它的話會破壞程式的架構、使得程式的邏輯難以trace,事實上,在完全不使用goto的情況下, 您也可以使用結構化的語法來撰寫程式。

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

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

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

#include <iostream> 
using namespace std;

int main() {
int input = 0;

begin:

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

if(input == 0)
goto error;

cout << "100 / " << input
<< " = " << static_cast<double>(100) / input
<< endl;

return 0;

error:
cout << "除數不可為0" << endl;
goto begin;
}

執行結果:
輸入一數:0
除數不可為 0
輸入一數:10
100 / 10 = 10


如果您輸入0,則程式會跳至error標籤然後顯示錯誤訊息,並重新跳至begin標籤,然後再執行一次提示與輸入,想想看就知道了,多跳個幾次之後,這 個程式的邏輯馬上會讓您變得混亂不堪。

這個程式還是這麼寫好一些:

#include <iostream> 
using namespace std;

int main() {
int input = 0;

while(true) {
cout << "輸入一數:";
cin >> input;

if(input != 0) {
cout << "100 / "
<< input
<< " = "
<< static_cast<double>(100) / input
<< endl;

break;
}
cout << "除數不可為0";
}

return 0;
}

總之,最好先忘了goto的存在,多培養結構化程式設計的思考,習慣養成之後就不會再想要用到goto了。