4. 流程控制:让代码学会“看情况办事”

各位同学,咱们今天聊点实在的。

你想想看,如果代码只能从上往下一条条执行,那跟流水账有什么区别?真正的程序,得会“看人下菜碟”,得会“反复打磨”。这就是流程控制要做的事。

我个人习惯把流程控制分成两大家族:分支家族(if、switch)和循环家族(while、do-while、for)。咱们一个一个盘。

核心思想: 程序不是死脑筋,它得根据条件选择走哪条路,或者重复做某件事直到满意为止。

流程控制知识体系 分支控制 if-else 语句 switch 语句 根据条件选择执行路径 循环控制 while / do-while for 循环 重复执行直到条件不满足 循环辅助 break / continue

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 让循环更灵活。多写多练,这些就会变成你的肌肉记忆。

公众号:蓝海资料掘金营,微信deep3321