第 14 章 刹车与跳过——break 与 continue
🏗️ 前情回顾:上一章你学会了循环套循环——外层管行、内层管列,九九乘法表都能打出来。但套得越深越需要控制:跑到一半想停怎么办?这章给循环装上刹车和跳过键。
🎯 本章目标
学完这一章,你能:
- 用
break提前跳出循环——不等跑完就收工 - 用
continue跳过当前轮——这轮不算,下轮继续 - 区分
break跳出的是哪一层循环 - 在嵌套循环中用标记变量跳出多层循环
- 理解 break/continue 的适用场景和限制
📖 故事引入
故事一:脚崴了还跑完这圈?
体育课上,老师让你跑 3 圈。跑到第 2 圈半,你突然脚崴了。
你用 for 循环的逻辑想:"循环条件是 i <= 3,现在 i = 2,条件还成立,我不能停……"
别傻了!脚崴了就立刻停下找医生,不是跑完这圈再说。编程里这就是 break——紧急刹车,立刻退出。
故事二:这圈踩线了,不算
运动会 400 米比赛。你跑到第 2 圈时踩了内圈的线——裁判吹哨:"踩线!这圈成绩不算,直接跑下一圈!"
你不是退出比赛,也不是重跑这一圈,而是跳过这圈,进入下一圈。编程里这就是 continue——这轮不算,下轮继续。
🧱 知识讲解
14.1 break:紧急刹车
break 的作用:立刻退出当前循环,后面还剩多少轮都不跑了——就像脚崴了立刻停,不等跑完这圈。
// 找 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 不是"退出循环",而是"跳过本轮剩下的代码,直接开始下一轮"——就像踩线了这圈不算,跑下一圈。
// 输出 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,只跳出内层,外层继续跑:
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 怎么跳出所有循环?——标记变量
如果你想在内层发现某个条件后,把外层也一起停掉,怎么办?需要一个标记变量(也叫"标志位"):
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 也能用:
// 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;
}// 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. 读代码写输出
for (int i = 1; i <= 10; i++) {
if (i % 3 == 0) continue;
if (i == 8) break;
cout << i << " ";
}写出上面代码的输出:_________
4. 代码找错
以下代码想在找到第一个能被 2 和 3 同时整除的数后退出,有什么问题?
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(标记变量跳出多层)是本章难点。。★核心(课堂必做) ◆拓展(课后练习)
| 级别 | 题号 | 链接 | 覆盖知识点 |
|---|---|---|---|
| ★ 核心 | J0053 | https://hydro.ac/d/srqc/p/J0053 | break、提前终止、质数口袋 |
| ◆ 拓展 | J0060 | https://hydro.ac/d/srqc/p/J0060 | break、找到即停、质因数 |
| ◆ 拓展 | J0058 | https://hydro.ac/d/srqc/p/J0058 | continue、跳过处理、最值差 |
| ◆ 拓展 | luogu-P1075 | https://hydro.ac/p/luogu-P1075 | break、第一个因数、出口 |
| ◆ 拓展 | J0059 | https://hydro.ac/d/srqc/p/J0059 | break/continue、最长连号 |
| ◆ 拓展 | luogu-P5724 | https://hydro.ac/p/luogu-P5724 | continue、跳过异常值 |
| ◆ 拓展 | J0095 | https://hydro.ac/d/srqc/p/J0095 | break、多层循环标记变量跳出 |
💡 练习建议:先完成 1 道★核心题,确保掌握本章基本方法;再完成 6 道◆拓展题,覆盖不同变式和细节。
配套练习
共7题。break练"找到就停",continue练"跳过不处理"。J0095(标记变量跳出多层)是本章难点。★核心(课堂必做) · ◆拓展(课后练习)
| 级别 | 题号 | 链接 | 覆盖知识点 |
|---|---|---|---|
| ★ 核心 | J0053 | https://hydro.ac/d/srqc/p/J0053 | break、提前终止、质数口袋 |
| ◆ 拓展 | J0060 | https://hydro.ac/d/srqc/p/J0060 | break、找到即停、质因数 |
| ◆ 拓展 | J0058 | https://hydro.ac/d/srqc/p/J0058 | continue、跳过处理、最值差 |
| ◆ 拓展 | luogu-P1075 | https://hydro.ac/p/luogu-P1075 | break、第一个因数、出口 |
| ◆ 拓展 | J0059 | https://hydro.ac/d/srqc/p/J0059 | break/continue、最长连号 |
| ◆ 拓展 | luogu-P5724 | https://hydro.ac/p/luogu-P5724 | continue、跳过异常值 |
| ◆ 拓展 | J0095 | https://hydro.ac/d/srqc/p/J0095 | break、多层循环标记变量跳出 |
练习建议:先在课堂完成 1 道★核心题,掌握本章基本方法;课后完成 6 道◆拓展题,覆盖不同变式和细节。
自查清单:
- [ ] 我能解释 break 和 continue 的区别(脚崴 vs 踩线)
- [ ] 我知道 break 只跳出一层循环
- [ ] 我会用标记变量跳出多层循环
- [ ] 我能在 while 和 for 中正确使用 break 和 continue
- [ ] 我知道什么时候该用 break/continue,什么时候不该用
🚀 下章预告:条件和循环你能分开了——但真实问题从来不分家。猜数字要循环套分支,菜单要分支套循环。下一章是 M2 综合实战,我们把所有武器拧成一股绳。