4. 流程控制语句:if-else、switch-case、while、do-while、for循环、break与continue
流程控制,说白了就是让程序学会「做选择」和「反复做」。
没有流程控制的代码,就像一条笔直的单行道——从头走到尾,一步不多,一步不少。但现实世界哪有这么简单?你写个登录系统,得判断密码对不对;写个游戏,得让角色反复移动;写个数据处理程序,得循环遍历成千上万条记录。
所以,流程控制是C++的骨架。今天我就带你把这套骨架搭结实。
核心要点:流程控制分为三大类——分支选择(if-else、switch-case)、循环迭代(while、do-while、for)、跳转控制(break、continue)。这三类组合起来,能解决你99%的逻辑需求。
4.1 分支选择:if-else 与 switch-case
先说说if-else。这是最基础、最常用的分支语句。我个人习惯把if-else想象成「岔路口」——条件成立走左边,不成立走右边。
int score = 85;
if (score >= 90) {
cout << "优秀" << endl;
} else if (score >= 80) {
cout << "良好" << endl;
} else if (score >= 60) {
cout << "及格" << endl;
} else {
cout << "不及格" << endl;
}
嗯,这里要注意:else if 的顺序很重要。如果你把 score >= 60 写在前面,那85分就会先匹配到「及格」,后面的「良好」永远没机会执行。我在项目中遇到过这种bug,排查了半天才发现是条件顺序搞反了。
小技巧:当判断条件是一个变量的多个离散值时,用switch-case更清晰。比如判断星期几、菜单选项、状态码等。
int day = 3;
switch (day) {
case 1:
cout << "周一" << endl;
break;
case 2:
cout << "周二" << endl;
break;
case 3:
cout << "周三" << endl;
break;
default:
cout << "其他" << endl;
break;
}
switch-case有个坑——别忘了写break。我曾经在写一个菜单程序时,漏掉了某个case的break,结果用户选了选项1,程序把选项1、2、3全执行了一遍。这就是所谓的「穿透」现象。如果你确实想利用穿透,记得加注释说明,不然同事会骂你。
避坑指南:switch-case只能判断整型、字符型、枚举型,不能判断浮点数或字符串。如果你需要判断浮点数范围,老老实实用if-else。
4.2 循环迭代:while、do-while、for
循环,就是让一段代码反复执行。你想想看,如果没有循环,你要输出1到100,得写100行cout,那得多崩溃?
4.2.1 while 循环
while循环的特点是「先判断,后执行」。条件不满足,一次都不执行。
int i = 1;
while (i <= 5) {
cout << i << " ";
i++;
}
// 输出:1 2 3 4 5
这里有个经典错误——忘记更新循环变量。如果你忘了写 i++,那 i 永远等于1,循环永远不结束,程序就卡死了。我刚开始学的时候,经常犯这个错,然后盯着屏幕发呆:「怎么没反应?」
4.2.2 do-while 循环
do-while和while的区别就一句话:至少执行一次。它先执行循环体,再判断条件。
int i = 1;
do {
cout << i << " ";
i++;
} while (i <= 5);
// 输出:1 2 3 4 5
你可能会问:「什么时候用do-while?」我举个例子:写一个猜数字游戏,你至少要让用户猜一次吧?这时候do-while就比while合适。
4.2.3 for 循环
for循环是C++里最强大的循环。它把初始化、条件判断、变量更新都写在一行,结构清晰。
for (int i = 1; i <= 5; i++) {
cout << i << " ";
}
// 输出:1 2 3 4 5
我个人习惯:知道循环次数用for,不知道循环次数用while。比如遍历数组,你知道数组长度,用for;读取文件直到末尾,你不知道什么时候结束,用while。
核心对比:
| 循环类型 | 执行特点 | 适用场景 |
|---|---|---|
| while | 先判断,后执行 | 条件控制,可能一次都不执行 |
| do-while | 先执行,后判断 | 至少需要执行一次 |
| for | 初始化+判断+更新 | 已知循环次数 |
4.3 跳转控制:break 与 continue
break和continue是循环里的「刹车」和「跳过」按钮。
- break:立即跳出整个循环,不再执行后续任何循环。
- continue:跳过本次循环的剩余部分,直接进入下一次循环。
// break 示例:找到第一个能被7整除的数
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) {
cout << "找到了:" << i << endl;
break; // 找到就停,后面的不用找了
}
}
// continue 示例:输出1到10中所有奇数
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 偶数跳过,不输出
}
cout << i << " ";
}
// 输出:1 3 5 7 9
避坑指南:break和continue只作用于最内层的循环。如果你有嵌套循环,break只能跳出当前这一层,外层循环继续执行。我曾经在写二维数组搜索时,想用break一次性跳出两层循环,结果发现只跳出了一层——后来改用标志变量或goto才解决。
4.4 知识体系总览
下面这张图,把本章的流程控制体系串起来了。你可以把它当作一张「地图」,以后写代码时对照着看。
4.5 综合示例:猜数字游戏
把今天学的知识串起来,写一个简单的猜数字游戏。这个例子我在教学时经常用,因为它几乎用到了所有流程控制语句。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
srand(time(0));
int target = rand() % 100 + 1; // 1~100随机数
int guess;
int attempts = 0;
cout << "猜一个1~100之间的数字:" << endl;
do {
cout << "输入你的猜测:";
cin >> guess;
attempts++;
if (guess > target) {
cout << "太大了!" << endl;
} else if (guess < target) {
cout << "太小了!" << endl;
} else {
cout << "恭喜你!猜对了!" << endl;
cout << "你用了 " << attempts << " 次。" << endl;
break; // 猜对就跳出循环
}
if (attempts >= 10) {
cout << "次数太多,游戏结束!答案是:" << target << endl;
break;
}
} while (true); // 无限循环,靠break退出
return 0;
}
你看,这个例子用了do-while(至少猜一次)、if-else(判断大小)、break(退出循环)。麻雀虽小,五脏俱全。
个人经验:写循环时,我习惯先想清楚「什么时候退出」。是达到某个条件退出?还是遇到错误退出?想清楚退出条件,再写循环体,这样不容易写出死循环。
好了,流程控制就讲到这里。这些语句你每天写代码都会用到,多练几次就熟了。记住:if-else做选择,for/while做重复,break/continue做控制——这三板斧,够你闯荡C++江湖了。
公众号:蓝海资料掘金营,微信deep3321