流程控制:分支与循环
这是什么:流程控制 = 让程序做选择和重复劳动的语法,主角是 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 的两大区别
- 条件要加小括号:写
if (score >= 60),不是if score >= 60 - 用大括号圈范围,不靠缩进——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 跳过。
动手改
- 改造 for 循环,打印 9 的乘法口诀:
9x1=9一直到9x9=81 - 把
while (true)改成while (n <= 7)并删掉 break,验证输出一模一样 - 故意删掉
if后面的大括号、只留缩进,看看程序行为还对不对——亲身体会"缩进对 C++ 只是装饰" - 写一个
switch,根据输入 1~7 打印"星期一"到"星期日",其他输入打印"无效"
下一章:函数,把代码打包复用 🐸