4. 流程控制:让代码学会“看情况办事”
各位同学,咱们今天聊点实在的。
你想想看,如果代码只能从上往下一条条执行,那跟流水账有什么区别?真正的程序,得会“看人下菜碟”,得会“反复打磨”。这就是流程控制要做的事。
我个人习惯把流程控制分成两大家族:分支家族(if、switch)和循环家族(while、do-while、for)。咱们一个一个盘。
核心思想: 程序不是死脑筋,它得根据条件选择走哪条路,或者重复做某件事直到满意为止。
4.1 if-else 语句:最朴素的“如果…就…”
if-else 是 C++ 里最基础的分支工具。说白了,就是让代码做选择题。
int score = 85;
if (score >= 60) {
cout << "及格了,不错!" << endl;
} else {
cout << "没及格,继续加油。" << endl;
}
嗯,这里要注意:if 后面跟的条件一定要用括号括起来。我见过不少新手写 if score > 60,少了括号,编译直接报错。
我的习惯: 哪怕 if 后面只有一条语句,我也加花括号。为什么?因为后期维护时,你很可能想再加一行代码,有括号直接加,没括号就容易出 bug。我在项目中吃过这个亏,后来就长记性了。
多分支的情况,用 else if 串联起来:
if (score >= 90) {
cout << "优秀" << endl;
} else if (score >= 80) {
cout << "良好" << endl;
} else if (score >= 70) {
cout << "中等" << endl;
} else {
cout << "继续努力" << endl;
}
你想想看,如果条件特别多,比如判断星期几,用 if-else 写起来就有点啰嗦了。这时候就该 switch 登场。
4.2 switch 语句:多路分支的利器
switch 适合“一个变量,多个固定值”的场景。比如根据用户输入的数字执行不同操作:
int cmd = 2;
switch (cmd) {
case 1:
cout << "执行查询" << endl;
break;
case 2:
cout << "执行修改" << endl;
break;
case 3:
cout << "执行删除" << endl;
break;
default:
cout << "未知命令" << endl;
break;
}
我曾经踩过的坑: 忘记写 break!如果不写 break,程序会继续往下执行下一个 case,这叫“穿透”。有时候故意利用穿透(比如多个 case 执行相同代码),但大多数时候是 bug。我当年调试一个通信协议解析,查了整整一下午,最后发现就是少了个 break。
switch 的变量类型必须是整型、字符型或枚举型。浮点数不行,字符串也不行(C++11 之后可以用字符串,但那是另一回事了)。
4.3 while 循环:先判断,再执行
while 循环的逻辑很简单:只要条件为真,就一直执行。适合“不知道要循环多少次”的场景。
int i = 0;
while (i < 5) {
cout << "第 " << i << " 次循环" << endl;
i++;
}
这里有个关键点:循环体内一定要改变条件变量的值,否则就成了死循环。我见过有人写 while(1) 然后忘了加 break,程序直接卡死。
实用场景: 读取文件直到结束、等待用户输入有效值、网络数据接收等。while 循环特别适合“不确定次数”的重复操作。
4.4 do-while 循环:先干一次,再判断
do-while 和 while 的区别就一句话:do-while 至少执行一次循环体。
int i = 10;
do {
cout << "i 的值是: " << i << endl;
i++;
} while (i < 5); // 条件不满足,但循环体已经执行了一次
你想想看,什么时候用 do-while?比如你要显示一个菜单,至少显示一次,然后根据用户选择决定是否继续显示。这种场景 do-while 就很自然。
我个人习惯:能用 while 的地方尽量用 while,因为 do-while 的“至少执行一次”有时候会带来意外。但如果你明确需要先执行一次,那就用 do-while,别犹豫。
4.5 for 循环:最常用的循环
for 循环把“初始化、条件判断、变量更新”三件事写在一行,结构清晰。适合“知道循环次数”的场景。
for (int i = 0; i < 10; i++) {
cout << "i = " << i << endl;
}
嗯,这里要注意:循环变量 i 的作用域只在 for 循环内部(C++11 标准)。如果你在循环外面还想用 i,得提前声明。
我的经验: 遍历数组、容器时,for 循环是首选。配合 C++11 的 range-based for 循环,代码更简洁:
vector<int> vec = {1, 2, 3, 4, 5};
for (int v : vec) {
cout << v << endl;
}
这种写法不容易越界,我强烈推荐。
4.6 break 与 continue:循环的“刹车”和“跳过”
这两个关键字用来控制循环内部的执行流程。
- break:立即跳出整个循环,不再执行后续迭代。
- continue:跳过本次循环的剩余部分,直接进入下一次迭代。
for (int i = 0; i < 10; i++) {
if (i == 3) {
continue; // 跳过 i=3 这次循环
}
if (i == 7) {
break; // 到 i=7 时直接退出循环
}
cout << i << " ";
}
// 输出: 0 1 2 4 5 6
我曾经犯过的错: 在嵌套循环里用 break,结果只跳出了内层循环,外层还在跑。break 只对当前所在的循环生效。如果想跳出多层循环,得用 goto 或者设置标志变量。我个人建议用标志变量,goto 容易让代码变得混乱。
continue 在循环嵌套里也要小心。它只跳过当前循环的本次迭代,不影响外层循环。
4.7 实战建议:怎么选?
| 场景 | 推荐结构 | 原因 |
|---|---|---|
| 条件分支少(2~3个) | if-else | 简单直观,可读性好 |
| 条件分支多且是固定值 | switch | 结构清晰,效率略高 |
| 不确定循环次数 | while | 灵活,条件控制方便 |
| 至少执行一次 | do-while | 保证循环体至少运行一次 |
| 知道循环次数 | for | 结构紧凑,不易遗漏更新 |
最后说一句:流程控制是编程的骨架。你想想看,没有分支和循环,程序就是一潭死水。把这些基础打牢,后面学函数、类、数据结构都会轻松很多。
总结一下: if-else 和 switch 让代码会“思考”,while、do-while、for 让代码会“重复”,break 和 continue 让循环更灵活。多写多练,这些就会变成你的肌肉记忆。