🐸 青蛙编程网
首页 / C++ / C++ 基础 / 4. 流程控制

流程控制:分支与循环

这是什么:流程控制 = 让程序做选择和重复劳动的语法,主角是 if 分支和 for/while 循环。

为什么用:变量会记事了,这一章让程序学会做选择(if)和重复劳动(循环)——顺便认识 C++ 和 Python 最直观的区别:大括号。只会直线往下走的程序,既判断不了好坏,也干不了重复的活。

如何用:先写一个 if/else 判断分数,再把它改成 for 循环数遍次数,最后用 while 配 break/continue 控制循环节奏。

if / else:分岔路口

#include <iostream>

int main() {
    int score = 75;

    if (score >= 90) {
        std::cout << "优秀!" << std::endl;
    } else if (score >= 60) {
        std::cout << "及格,继续加油" << std::endl;
    } else {
        std::cout << "要补考了…" << std::endl;
    }
    return 0;
}

你会看到

及格,继续加油
代码 作用
if (条件) 条件为 true 才执行后面的大括号;条件必须套小括号
else if / else 前面都不满足时的备选路
{ } 圈出"条件满足时要干的事"

和 Python 的两大区别

  1. 条件要加小括号:写 if (score >= 60),不是 if score >= 60
  2. 用大括号圈范围,不靠缩进——Python 靠缩进定"地盘",C++ 的缩进只是为了好看,大括号才是正文

虽然语法允许大括号里只有一句时省略 {},但初学阶段请永远写大括号——省略大括号是无数 bug 的温床。

嵌套 if:条件里套条件

#include <iostream>

int main() {
    int age = 20;
    bool hasID = true;

    if (age >= 18) {
        if (hasID) {
            std::cout << "可以进入" << std::endl;
        } else {
            std::cout << "需要出示身份证" << std::endl;
        }
    } else {
        std::cout << "未成年,禁止进入" << std::endl;
    }
    return 0;
}

for 循环:数着次数重复

#include <iostream>

int main() {
    for (int i = 1; i <= 5; i++) {
        std::cout << "第 " << i << " 次俯卧撑" << std::endl;
    }
    return 0;
}

你会看到

第 1 次俯卧撑
第 2 次俯卧撑
第 3 次俯卧撑
第 4 次俯卧撑
第 5 次俯卧撑

for (初始; 条件; 更新) 三段式:i 从 1 出发,只要 i <= 5 就干活,每轮结束 i++ 加一。对照 Python 的 for i in range(1, 6),是不是异曲同工?

for 循环嵌套:九九乘法表

#include <iostream>

int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            std::cout << j << "×" << i << "=" << i * j << "\t";
        }
        std::cout << std::endl;
    }
    return 0;
}

while、break 与 continue

#include <iostream>

int main() {
    int n = 0;
    while (true) {
        n++;
        if (n % 2 == 0) {
            continue;  // 偶数:跳过后面,直接下一轮
        }
        if (n > 7) {
            break;     // 跳出整个循环
        }
        std::cout << n << " ";
    }
    std::cout << std::endl;
    return 0;
}

你会看到

1 3 5 7
关键字 作用
while (条件) 条件为真就一直转,while (true) 是故意设计的"死循环"
break 立刻跳出整个循环,收工
continue 跳过本轮剩下的部分,直接进入下一轮

do-while:先执行再判断

#include <iostream>

int main() {
    int i = 0;
    do {
        std::cout << i << " ";
        i++;
    } while (i < 3);
    std::cout << std::endl;
    return 0;
}

你会看到

0 1 2

do-while 保证至少执行一次循环体,因为判断在最后。

switch:多重分支的简洁写法

当你要把一个变量跟很多固定值比较时,switch 比一串 if/else 更清晰:

#include <iostream>

int main() {
    int day = 3;

    switch (day) {
        case 1: std::cout << "星期一" << std::endl; break;
        case 2: std::cout << "星期二" << std::endl; break;
        case 3: std::cout << "星期三" << std::endl; break;
        case 4: std::cout << "星期四" << std::endl; break;
        case 5: std::cout << "星期五" << std::endl; break;
        default: std::cout << "周末" << std::endl;
    }
    return 0;
}

你会看到

星期三
  • case 后面必须是常量(如整数、字符)
  • 每个 case 结尾建议加 break,否则会"穿透"继续执行下一个 case
  • default 是"其他情况"的兜底,可选

❓ 常见问题

Q1:if 里能不写大括号吗?

语法上允许只有一行时省略,但强烈建议永远写大括号。省略大括号容易在后续修改代码时引入难以察觉的 bug。

Q2:for 里的 i 在循环外还能用吗?

不能。for (int i = 1; ...) 里的 i 作用域仅限于循环内部,循环结束后 i 就销毁了。

Q3:switch 能用字符串吗?

不能。C++ 的 switch 只支持整型、枚举等整数类型,不支持 std::string。要比较字符串,还是用 if/else。

⚠️ 新手翻车现场

翻车一:缩进骗人,大括号才是正文

// 错误:看起来 like 属于 if,其实不属于
if (score >= 60)
    std::cout << "通过" << std::endl;
    std::cout << "发证书" << std::endl;  // 这行其实不受 if 控制,总会执行

问题:C++ 不靠缩进判断归属,只靠大括号。没有大括号,只有紧跟在 if 后的那一行受控制。

修正:

if (score >= 60) {
    std::cout << "通过" << std::endl;
    std::cout << "发证书" << std::endl;
}

翻车二:while (true) 忘了 break,程序跑不停

while (true) {
    std::cout << "一直在打印…" << std::endl;
    // 没有 break,也没有让条件变假的代码
}

问题:这是个真正的死循环,程序不会自己停,得手动强制结束(Ctrl+C 或关闭终端)。

修正:在循环里加 break 条件,或改成 while (n <= 10) 这类会终止的条件。

🎯 什么时候用哪种循环

场景 推荐 原因
已知循环次数 for 三段式清晰,初始、条件、更新集中在一行
次数未知,先判断后执行 while 条件不满足时可能一次都不执行
次数未知,至少执行一次 do-while 先执行循环体,再判断条件
多个固定值匹配 switch 比一串 if/else 更清晰

📝 本章小结

  • if/else if/else:条件带小括号,地盘用大括号
  • for:已知次数循环,三段式(初始;条件;更新)
  • while:未知次数,条件为真就转
  • break 跳出整个循环,continue 跳过本轮
  • switch 适合多个固定值匹配,记得加 break 防止穿透
  • 记忆口诀:条件带括号,地盘大括号;break 走人,continue 跳过。

动手改

  1. 改造 for 循环,打印 9 的乘法口诀:9x1=9 一直到 9x9=81
  2. 把 while (true) 改成 while (n <= 7) 并删掉 break,验证输出一模一样
  3. 故意删掉 if 后面的大括号、只留缩进,看看程序行为还对不对——亲身体会"缩进对 C++ 只是装饰"
  4. 写一个 switch,根据输入 1~7 打印"星期一"到"星期日",其他输入打印"无效"

下一章:函数,把代码打包复用 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。