C++ 循环控制与综合应用
困难15循环里的“刹车”和“跳过”——用 break 和 continue 控制程序节奏
在写循环的时候,我们常常需要根据情况临时改变执行流程。比如:
- 跑接力赛时,有人犯规,整场比赛直接结束(break)。
- 跑接力赛时,有人摔倒了,裁判让他重新跑这一棒,比赛继续(continue)。
break 可以让你立刻跳出整个循环,不再执行后面的任何一轮;continue 则让你跳过当前这一轮剩下的代码,直接开始下一轮。学会这两个小工具,你的程序就能像小管家一样灵活应对各种突发状况。
一、break:急刹车,立刻终止整个循环
想象你在数数:从1开始加,一直加到100,但你想在总和超过1000时就停下来。用 break 就能轻松做到。
#include <iostream>
using namespace std;
int main() {
int sum = 0; // 总和
for (int i = 1; i <= 100; i++) { // 循环变量i从1到100
sum = sum + i; // 把i累加到sum
if (sum > 1000) { // 如果总和超过1000
cout << "加到" << i << "时总和已超过1000,停止" << endl;
break; // 立即跳出整个for循环
}
}
cout << "最终和 = " << sum << endl;
return 0;
}
运行结果:
加到45时总和已超过1000,停止
最终和 = 1035
生活中的例子:
老师让同学们轮流报数,当报到的数超过50时,老师就说“停,下节课再继续”。break 就是那个“停”的口令。
常见错误:
在嵌套循环(循环里还有循环)中,break 只会跳出它所在的最内层循环,不会跳出所有层。比如你写了两层 for 循环,内层的 break 只跳出内层,外层还会继续。
解决方法是:如果真想跳出所有层,可以用标志变量(后面会讲到)或者改用 return 直接结束函数。
二、continue:跳过本轮,直接进入下一轮
如果你只想打印1~10之间的奇数,遇到偶数就不打印,可以用 continue 跳过偶数。
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) { // 循环变量i从1到10
if (i % 2 == 0) { // 如果i是偶数
continue; // 跳过本轮,直接执行i++进入下一轮
}
cout << i << " "; // 只有奇数才会被执行到
}
cout << endl;
return 0;
}
运行结果:
1 3 5 7 9
生活中的例子:
跳绳比赛,每个人跳一次。如果某个人绊倒了,裁判说“不算,重新跳一次”,这个人就相当于被 continue 了——跳过这次计数,直接让下一个人跳。注意:这里不是退出比赛,只是跳过这一轮。
常见错误:
在 while 循环中使用 continue 时,如果忘记更新循环变量,很容易造成死循环。例如:
int i = 0;
while (i < 10) {
if (i % 2 == 0) {
continue; // 这里跳过了 i++,i 永远不变,会无限循环
}
i++;
}
正确的做法是:把循环变量的更新放在 continue 之前,或者用 for 循环(for 的更新表达式在每次循环末尾自动执行,即使 continue 也会执行)。
三、综合应用:找出100以内的所有质数
质数是只能被1和它本身整除的数(比如2、3、5、7……)。我们用一个循环检查每个数,内层判断它是否能被2到它本身减1之间的数整除。如果发现能整除,就说明它不是质数,用 break 跳出内层循环;如果内层循环完整跑完(没有 break),就说明它是质数。
#include <iostream>
using namespace std;
int main() {
cout << "100以内的质数有:";
for (int num = 2; num <= 100; num++) { // num:当前检查的数
bool isPrime = true; // 默认是质数
for (int i = 2; i < num; i++) { // i:可能的除数
if (num % i == 0) { // 如果num能被i整除
isPrime = false; // 标记为不是质数
break; // 立即停止内层循环,不用再检查更大的i
}
}
if (isPrime) { // 如果标记仍为true,说明是质数
cout << num << " ";
}
}
cout << endl;
return 0;
}
运行结果:
100以内的质数有:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
为什么用 break?
内层循环一旦发现 num 能被某个 i 整除,就已经确认不是质数了,继续检查更大的 i 毫无意义。用 break 直接跳出内层循环,节省时间。这叫做提前终止。
巧妙利用“没有break”:
其实还可以不用 isPrime 变量,直接利用 break 后的循环结束方式判断。但用标志变量更易懂,初学者建议先用这种方法,熟悉后再尝试更高级的技巧。
四、新手容易犯的错误汇总
-
break 只跳出当前循环
在嵌套循环中使用 break,它会跳出它所在的那一层,外层依然继续。如果想一次跳出所有层,可以把循环条件设为假,或者用return直接结束函数。 -
continue 忘记更新循环变量(尤其在 while 中)
如前面说的死循环。解决办法是:尽量用for循环,或者在while循环里把变量更新放在continue之前。 -
滥用 break 和 continue 让代码难读懂
比如在很长的循环里突然break,别人很难一眼看出什么时候会中断。建议:- 尽量把条件写清楚,或者把复杂逻辑拆成单独的函数。
- 如果有多个跳出点,加注释说明。
-
在 switch 语句里误解 break
switch里的break是跳出switch,不是跳出循环。如果循环里面有switch,想跳出循环要小心使用。
五、完整可运行的示例:输入密码(最多尝试3次)
这是一个结合 while 和 break 的经典小项目:用户有3次机会输入密码,输对就成功,3次全错则锁定账户。
#include <iostream>
using namespace std;
int main() {
int password = 123456; // 正确的密码
int guess; // 用户每次输入的猜测
int tries = 0; // 已经尝试的次数
while (tries < 3) {
cout << "请输入密码(还有" << 3 - tries << "次机会):";
cin >> guess;
if (guess == password) {
cout << "登录成功!" << endl;
break; // 密码正确,立刻结束循环
}
tries++; // 密码错误,尝试次数加1
}
if (tries == 3) {
cout << "密码错误,账户锁定。" << endl;
}
return 0;
}
运行示例:
输入111111 → 提示还有2次机会
输入222222 → 提示还有1次机会
输入123456 → 登录成功!
如果三次都错:
输入111111 → 提示2次机会
输入222222 → 提示1次机会
输入333333 → 密码错误,账户锁定。
代码解释:
while (tries < 3)保证最多循环3次。- 如果密码正确,
break跳出循环,后面的tries++不再执行。 - 如果密码错误,
tries++增加次数,然后继续下一轮循环。 - 循环结束后,检查
tries是否等于3,等于说明一次都没正确过。
思考:如果不用 break,你会怎么写?可以用额外的标志变量或者 return,但 break 是最简洁的。
六、相关知识点指引
- 嵌套循环:循环里面再套循环,是处理二维问题(如乘法表、矩阵)的基础。
- 标志变量(flag):用一个
bool变量记录状态,常和break搭配来控制多级跳出。 - 循环优化:通过提前
break减少不必要的计算,比如找质数时只检查到sqrt(num)就能加快速度。 - 其他控制语句:
return可以跳出整个函数,goto可以跳转到任意位置(但一般不推荐使用)。
掌握了 break 和 continue,你的程序就能像交通警察一样,随时指挥车流(循环)停下来或绕过障碍物。多写几个小练习,比如“猜数字游戏”“求不大于100的最大质数”,你会越来越熟练!
例题精讲
运行以下代码,输出结果是? for (int i = 0; i < 5; i++) { if (i == 2) break; cout << i; }
在C++循环中,执行continue语句后,循环体内continue之后的代码将不再执行,但循环会继续下一次迭代(如果有)。
下面的程序输出1到10中所有不能被3整除的数。请在空白处填入合适的语句。
for (int i = 1; i <= 10; i++) {
if (i % 3 == 0) ___;
cout << i << " ";
}关于break和continue,下列描述正确的是?
下面的程序计算1+2+3+...+n,但遇到5的倍数时跳过(即不加)。请补充代码。
int sum = 0, n = 10;
for (int i = 1; i <= n; i++) {
if (___ ) continue;
sum += i;
}
cout << sum;