Skip to content

第 14 章 刹车与跳过——break 与 continue


🏗️ 前情回顾:上一章你学会了循环套循环——外层管行、内层管列,九九乘法表都能打出来。但套得越深越需要控制:跑到一半想停怎么办?这章给循环装上刹车和跳过键。


🎯 本章目标

学完这一章,你能:

  • break 提前跳出循环——不等跑完就收工
  • continue 跳过当前轮——这轮不算,下轮继续
  • 区分 break 跳出的是哪一层循环
  • 在嵌套循环中用标记变量跳出多层循环
  • 理解 break/continue 的适用场景和限制

📖 故事引入

故事一:脚崴了还跑完这圈?

体育课上,老师让你跑 3 圈。跑到第 2 圈半,你突然脚崴了。

你用 for 循环的逻辑想:"循环条件是 i <= 3,现在 i = 2,条件还成立,我不能停……"

别傻了!脚崴了就立刻停下找医生,不是跑完这圈再说。编程里这就是 break——紧急刹车,立刻退出。

故事二:这圈踩线了,不算

运动会 400 米比赛。你跑到第 2 圈时踩了内圈的线——裁判吹哨:"踩线!这圈成绩不算,直接跑下一圈!"

你不是退出比赛,也不是重跑这一圈,而是跳过这圈,进入下一圈。编程里这就是 continue——这轮不算,下轮继续。


🧱 知识讲解

14.1 break:紧急刹车

break 的作用:立刻退出当前循环,后面还剩多少轮都不跑了——就像脚崴了立刻停,不等跑完这圈。

cpp
// 找 1~100 中第一个能被 7 整除又能被 5 整除的数
for (int i = 1; i <= 100; i++) {
    if (i % 7 == 0 && i % 5 == 0) {
        cout << "找到了:" << i << endl;  // 35
        break;  // 找到就停,不用再找 36~100
    }
}

循环本来要跑 100 轮,但找到 35 就刹车了——后面的 65 轮直接跳过。这就是 break找到就够了,不浪费力气。

14.2 continue:跳过当前轮

continue 不是"退出循环",而是"跳过本轮剩下的代码,直接开始下一轮"——就像踩线了这圈不算,跑下一圈。

cpp
// 输出 1~10 中的所有奇数
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue;  // 偶数就跳过,不输出
    }
    cout << i << " ";
}
// 输出:1 3 5 7 9

🧠 break vs continue:break 是"脚崴了,不跑了,找医生";continue 是"踩线了,这圈不算,跑下一圈"。

14.3 break 只跳一层——嵌套中的陷阱

break 只跳出它所在的那一层循环。如果你在嵌套循环的内层写 break,只跳出内层,外层继续跑:

cpp
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 5; j++) {
        if (j == 3) {
            break;  // 只跳出内层 j 循环
        }
        cout << "(" << i << "," << j << ") ";
    }
    cout << endl;  // 外层继续,进入下一行
}

输出:

(1,1) (1,2)
(2,1) (2,2)
(3,1) (3,2)
(4,1) (4,2)
(5,1) (5,2)

看!每行内层都只跑到了 j=2(到 3 就 break 了),但外层 5 行照样全部执行。内层的 break 管不到外层。

14.4 怎么跳出所有循环?——标记变量

如果你想在内层发现某个条件后,把外层也一起停掉,怎么办?需要一个标记变量(也叫"标志位"):

cpp
bool found = false;           // 标记:还没找到
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 5; j++) {
        if (i * j > 10) {    // 第一个乘积超过 10 的位置
            cout << "找到了:" << i << "×" << j << "=" << i*j << endl;
            found = true;    // 插旗子:找到了!
            break;           // 先跳出内层
        }
    }
    if (found) break;        // 看到旗子,外层也停!
}
// 输出:找到了:3×4=12

💡 标记变量的思路:设一个 bool 变量当旗子。内层发现问题时"插旗子"然后 break,外层每轮检查旗子——看到旗子也 break。 这是跳出多层循环最清晰的方法。

14.5 break 和 continue 用在 while 里

break 和 continue 不只在 for 里能用,while 和 do-while 也能用:

cpp
// while + break:密码最多试 3 次
int attempts = 0;
string password;
while (attempts < 3) {
    cout << "请输入密码:";
    cin >> password;
    if (password == "cpp123") {
        cout << "登录成功!" << endl;
        break;            // 对了就立刻退出,不用管 attempts
    }
    attempts++;
    cout << "密码错误,还剩 " << 3 - attempts << " 次机会" << endl;
}
if (attempts == 3) {
    cout << "3 次机会用完,账户已锁定。" << endl;
}
cpp
// while + continue:只处理正数,跳过负数
int n;
while (cin >> n) {
    if (n < 0) {
        continue;    // 负数跳过,不累加
    }
    sum += n;
}

14.6 break 和 continue 的使用原则

  • break:找到第一个就够、提前退出省时间、菜单里选"退出"
  • continue:过滤不需要的数据、跳过无效输入
  • 不要滥用:如果能用正常的循环条件表达退出/跳过,就别用 break/continue——正常的条件更容易看懂
  • continue 不要放在最后一行continue 跳过的是"它和循环末尾之间"的代码,放在最后等于啥也没跳

✋ 动手试试

试试 1:把 14.1 节的 break 代码里 break 删掉,重新运行。输出有什么不同?为什么?

试试 2:在嵌套循环的内层写一个 break,加上注释标明"这里只跳出内层",跑起来验证你的理解。

试试 3:写一个程序,输出 1~20 中所有不是 3 的倍数的数。用 continue 实现。

试试 4:写一个"密码登录"程序:正确密码是 "cpp123",用户最多可以输 3 次。用 while + break 实现。3 次都错就提示"账户锁定"。


⚠️ 你踩过这些坑吗

  • [ ] 坑 1:以为 break 能跳出所有循环——在内层写 break 只跳出内层,外层继续跑。想跳出多层,用标记变量。
  • [ ] 坑 2:continue 放到代码最后一行——for (...) { cout << i; continue; } 写了等于没写,后面本来就没代码。continue 要放在想跳过的代码之前
  • [ ] 坑 3:break/continue 跟循环条件打架——循环条件说"跑 100 次",break 说"第 35 次就停"。如果你早就知道第 35 次停,为什么不直接写循环条件呢?能用条件表达的逻辑,别依赖 break。
  • [ ] 坑 4:标记变量忘了在外层判断——内层插了旗子但外层没检查,等于白插。别忘了在内层 break 之后,外层也要 if (found) break;

📝 练习

基础题

1. 选择题

(1)break 的作用是什么?   A. 暂停循环   B. 跳过本轮,继续下一轮   C. 立即跳出当前循环   D. 重新开始循环

(2)continue 的作用是什么?   A. 结束程序   B. 跳过本轮剩余代码,进入下一轮   C. 退出所有循环   D. 输出空行

(3)嵌套循环内层的 break 会:   A. 跳出所有循环   B. 只跳出内层循环   C. 跳到外层循环开头   D. 结束程序

2. 填空题

(1)在嵌套循环的内层写 break,只会跳出 ______ 层循环。要跳出多层需要用 ______。

(2)break 的比喻是"______",continue 的比喻是"______"。

(3)while (true) 里如果没有 break,就会变成 ______。

3. 读代码写输出

cpp
for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) continue;
    if (i == 8) break;
    cout << i << " ";
}

写出上面代码的输出:_________

4. 代码找错

以下代码想在找到第一个能被 2 和 3 同时整除的数后退出,有什么问题?

cpp
for (int i = 1; i <= 100; i++) {
    if (i % 2 == 0 && i % 3 == 0) {
        cout << i << endl;
    }
    break;
}

提高题

5. 编程题 — 第一个完数

输出 1~10000 中第一个完数(一个数等于它所有真因子之和,如 6=1+2+3)。找到第一个就停止,用 break 实现。

6. 编程题 — 跳过含 7 的数

输出 1~100 中所有不含数字 7 的数(个位不是 7、十位也不是 7)。用 continue 实现。

7. 编程题 — 密码三次锁定

写一个密码登录程序:正确密码是 "cpp123",用户最多试 3 次。每次错误提示剩余次数,正确则立即退出循环。3 次全错提示"账户已锁定"。用 while + break 实现。

挑战题

8. 编程题 — 二维搜索

在一个"二维范围"内找第一个满足条件的数对 (i, j)。条件:i * j 能被 13 整除,且 i + j 能被 7 整除。从 (1,1) 开始搜索,找到第一对就报告并退出所有循环。用标记变量实现。

9. 编程题 — 猜数字·限次版

程序预设一个秘密数字(1~100),玩家最多猜 7 次。每次猜完提示"大了"或"小了",猜对用 break 退出,7 次猜不对显示"你输了,答案是 X"。用 for 循环 + break 实现。


🧠 本章小结

循环控制:
  break    — "脚崴了,立刻停" → 跳出当前循环
  continue — "踩线了,这圈不算" → 跳过本轮,下轮继续

嵌套中的 break:
  只跳出它所在的那一层!
  跳出多层 → bool found 标记变量:内层插旗,外层检查

使用原则:
  ✅ 找到第一个就够 → break
  ✅ 过滤不需要的数据 → continue
  ❌ 别滥用——能用循环条件表达的别用 break
  ❌ continue 别放最后——放了等于没放

📝 配套练习

共7题。break练"找到就停",continue练"跳过不处理"。J0095(标记变量跳出多层)是本章难点。。★核心(课堂必做) ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0053https://hydro.ac/d/srqc/p/J0053break、提前终止、质数口袋
◆ 拓展J0060https://hydro.ac/d/srqc/p/J0060break、找到即停、质因数
◆ 拓展J0058https://hydro.ac/d/srqc/p/J0058continue、跳过处理、最值差
◆ 拓展luogu-P1075https://hydro.ac/p/luogu-P1075break、第一个因数、出口
◆ 拓展J0059https://hydro.ac/d/srqc/p/J0059break/continue、最长连号
◆ 拓展luogu-P5724https://hydro.ac/p/luogu-P5724continue、跳过异常值
◆ 拓展J0095https://hydro.ac/d/srqc/p/J0095break、多层循环标记变量跳出

💡 练习建议:先完成 1 道★核心题,确保掌握本章基本方法;再完成 6 道◆拓展题,覆盖不同变式和细节。


配套练习

共7题。break练"找到就停",continue练"跳过不处理"。J0095(标记变量跳出多层)是本章难点。★核心(课堂必做) · ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0053https://hydro.ac/d/srqc/p/J0053break、提前终止、质数口袋
◆ 拓展J0060https://hydro.ac/d/srqc/p/J0060break、找到即停、质因数
◆ 拓展J0058https://hydro.ac/d/srqc/p/J0058continue、跳过处理、最值差
◆ 拓展luogu-P1075https://hydro.ac/p/luogu-P1075break、第一个因数、出口
◆ 拓展J0059https://hydro.ac/d/srqc/p/J0059break/continue、最长连号
◆ 拓展luogu-P5724https://hydro.ac/p/luogu-P5724continue、跳过异常值
◆ 拓展J0095https://hydro.ac/d/srqc/p/J0095break、多层循环标记变量跳出

练习建议:先在课堂完成 1 道★核心题,掌握本章基本方法;课后完成 6 道◆拓展题,覆盖不同变式和细节。

自查清单

  • [ ] 我能解释 break 和 continue 的区别(脚崴 vs 踩线)
  • [ ] 我知道 break 只跳出一层循环
  • [ ] 我会用标记变量跳出多层循环
  • [ ] 我能在 while 和 for 中正确使用 break 和 continue
  • [ ] 我知道什么时候该用 break/continue,什么时候不该用

🚀 下章预告:条件和循环你能分开了——但真实问题从来不分家。猜数字要循环套分支,菜单要分支套循环。下一章是 M2 综合实战,我们把所有武器拧成一股绳。