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;
}
printf("i = %d\n", i);
}
這段程式會顯示 i = 1
到 4
,因為當 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
的時機。