4.5 break 與 continue

圖 4-4:break vs continue 的差異

有時候你想在迴圈中途強制停止、或跳過當前一次的剩餘步驟。breakcontinue 就是做這個的。

break:立即跳出迴圈

  • 執行到 break 時,迴圈立刻結束
  • 只離開「最近的一層」迴圈

continue:跳過當前一次的剩餘步驟

  • 執行到 continue 時,立即跳到迴圈的下一次
  • 條件檢查和更新運算式還是會執行

範例程式碼

範例 1:用 break 提前結束迴圈

#include<iostream>
using namespace std;
int main() {
    // 照條件式要從 1 印到 10,但印完 5 就提早停止
    for (int i = 1; i <= 10; i++) {
        if (i > 5) {
            break;       // 當 i > 5 時強制跳出迴圈
        }
        cout << i << "\n";
    }

    return 0;
}

執行結果:

1
2
3
4
5

條件式明明寫著 i <= 10,卻只印到 5——break 不理會迴圈自己的條件式,執行到就立刻跳出

範例 2:用 continue 跳過偶數

#include<iostream>
using namespace std;
int main() {
    // 印出 1 到 10 的所有奇數
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;    // 偶數時跳到下一次迴圈
        }
        cout << i << "\n";  // 只有奇數會執行到這裡
    }

    return 0;
}

執行結果:

1
3
5
7
9

例題:判斷一個數是不是質數

質數是「大於 1、而且只有 1 和自己兩個因數」的數。給一個整數 nn \ge 2),判斷它是不是質數。

作法:試著用 2、3、4、…、n-1 去除 n,只要有一個能整除,就代表 n 有 1 和自己以外的因數,不是質數。一旦找到,就不必再試下去——break 立刻收工:

#include<iostream>
using namespace std;
int main() {
    int n;
    cin >> n;

    bool is_prime = true;           // 先假設它是質數
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {           // 找到一個因數
            is_prime = false;       // 那就不是質數
            break;                  // 已經確定了,別再白試
        }
    }

    if (is_prime) cout << n << " 是質數\n";
    else          cout << n << " 不是質數\n";

    return 0;
}

break 在這裡的意義是「答案已經確定,剩下的都是白做」。以 n = 15 為例:i = 2 除不盡、i = 315 % 3 == 0,馬上把 is_prime 設成 falsebreak,後面的 4、5、…、14 一個都不用試。這種「找到就走」的提早結束,是 break 最常見的用途。

動手試試看

  1. (break) 讀入一連串數字,一遇到負數就停止,輸出在那之前所有數字的總和(負數本身不算)。
  2. (continue) 印出 1 到 100 之間,所有不是 3 的倍數的數。
  3. (綜合) 讀入數字直到遇到 0(0 不算),輸出這些非零數字裡的最大值