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 知识体系总览

下面这张图,把本章的流程控制体系串起来了。你可以把它当作一张「地图」,以后写代码时对照着看。

流程控制语句知识体系 分支选择 循环迭代 跳转控制 if-else switch-case while do-while for break continue 使用建议 • 判断离散值 → switch-case(更清晰) • 判断范围/条件 → if-else(更灵活) • 已知次数 → for;未知次数 → while • 至少执行一次 → do-while;跳出循环 → break;跳过本次 → continue

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