break、 continue、goto


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

continue 的作用與 break 類似,主要使用於迴圈,所不同的是 break 會結束區塊的執行,而 continue 只會結束接下來區塊中的陳述句,並 跳回迴圈區塊的開頭繼續下一個迴圈,而不是離開迴圈,例如:

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

    printf("i = %d\n", i);
}

這段程式會顯示 i = 14,因為當 i 等於 5 時就會執行 break 而離開迴圈。

再看下面這個程式:

for(inr i = 1; i < 10; i++) {

if(i == 5) {
    continue;
}

printf("i = %d\n", i);

}

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

goto 是一個很方便,但是最不被建議使用的語法,濫用它的話會破壞程式的架構、使得程式的邏輯難以理解,事實上,在完全不使用 goto 的情況下, 也可以使用結構化的語法來撰寫程式。

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

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

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

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

#include <stdio.h>

int main(void) {
    int input = 0;

BEGIN:
    printf("輸入一數:");
    scanf("%d", &input);
    if(input == 0) {
        goto ERROR;
    }

    printf("100 / %d = %f\n", input, (double) 100 / input);

    return 0;

ERROR:
    puts("除數不可為 0");
    goto BEGIN;
}

執行結果:

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

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

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

#include <stdio.h>

int main(void) {
    int input = 0;

    while(!input) {
        printf("輸入一數:");
        scanf("%d", &input);

        if(input != 0) {
            printf("100 / %d = %f\n", input, (double) 100 / input);
        } else {
            puts("除數不可為 0");
        }
    }

    return 0;
}

就結論而言,goto 並非不可使用,只是初學者在還沒有足夠的經驗下,往往容易濫用,初學者最好暫時先忘了 goto 的存在,待足夠的經驗之後,才有能力判斷真正要使用 goto 的時機。