在上篇提到薛西弗斯的故事,如果今天眾神給薛西弗斯優待,只要達到某些條件就能提前結束推石頭的任務?
或者,在程式上,當我有以下程式
1 2 3 4 5 6 7
| #include <stdio.h> int main(){ for (int i = 0; i <= 10; i++) { printf("%d\n", i); } return 0; }
|
但我想遇到特定情況就退出迴圈,或是只要符合某些特定條件就不要輸出呢?
break
假設今天我要讓我的迴圈輸出我所輸入的數直到EOF,我們可以寫出
1 2 3 4 5 6 7 8
| #include <stdio.h> int main(){ int n = 0; while (scanf("%d", &n) != EOF) { printf("%d\n", n); } return 0; }
|
對吧?
不過,如果我今天加上一個限制:只要輸入的數字是 -1,我不但不輸出 -1,還直接退出迴圈呢?
這時 break 就能派上用場啦!
先提供以下程式碼給各位參考
break_example.c1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> int main(){ int n = 0; while (scanf("%d", &n) != EOF) { if (n == -1) { break; } printf("%d\n", n); } return 0; }
|
第5至7行的程式的意思是說,如果我輸入的數是 -1(if (n == -1)),則跳出迴圈(break)。
由此可見,break 的作用是使程式離開當前的迴圈。
試試看
試寫出一程式,輸出使用者輸入的數直到EOF,當輸入的數為-1或7時跳出迴圈。
試試看
觀察以下程式碼,並試推論輸出為何?
break_try.c1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> int main(){ for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) { if (i == 2 && j == 3) { break; } printf("i = %d, j = %d\n", i, j); } } return 0; }
|
continue
如果我想把程式改成「輸出使用者輸入的數直到EOF,但當使用者輸入的數為10時,不輸出但也不結束程式」怎麼辦呢?
一樣,先提供以下程式碼給各位參考
continue_example.c1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> int main(){ int n = 0; while (scanf("%d", &n) != EOF) { if (n == 10) { continue; } printf("%d\n", n); } return 0; }
|
第6行備註寫「跳過本次迴圈」,這裡的意思是指回到第4行的 scanf() 繼續讀取輸入,而不是執行第8行的 printf("%d\n", n)。也就是說,跳過本次迴圈剩餘的程式,直接進入下一次的迴圈。
試試看
試寫出一程式,輸出使用者輸入的數直到EOF,當輸入的數為-1時不輸出但不結束程式。
break與continue的特性
break 與 continue 有一個共同的特性就是:他作用的是他所在的最內層的迴圈。
舉個例子
break1.c1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> int main(){ for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) { if (i == 3) { break; } printf("i = %d, j = %d\n", i, j); } } return 0; }
|
大家可以觀察一下,實際執行後會發現 break1.c 的 break 跳離的是迴圈2但並未跳出迴圈1,這就是我所指的,break 會使程式離開他所屬的最內層的迴圈。
試試看
觀察以下程式碼,並試推論輸出為何?
continue_try.c1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> int main(){ for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) { if (i == 2 && j == 3) { continue; } printf("i = %d, j = %d\n", i, j); } } return 0; }
|
結語
以上就是C語言迴圈控制(break與continue部分)的簡介。
倘內容有誤或仍有疑問,歡迎在下方留言區留言!