Appearance
🚦 05. 分支语句
在生活中,我们经常需要根据不同的条件做出不同的选择。比如:
- 如果今天下雨,就带伞出门;否则就不带。
- 如果考试成绩 ≥ 60 分,就及格了;否则就不及格。
- 如果分数 ≥ 90,评为"优秀";如果 ≥ 60,评为"及格";否则评为"不及格"。
在编程里,这种根据条件决定执行哪段代码的机制,就叫做分支语句(也叫选择结构)。
NOTE
分支语句的核心就是"判断条件 → 选择执行"。它是让程序拥有"思考"能力的基础。
1. 关系运算符回顾
分支语句通常需要判断一个条件是否成立,这就会用到关系运算符(比较两个值的大小关系)。
| 运算符 | 含义 | 示例 |
|---|---|---|
> | 大于 | 5 > 3 → true |
< | 小于 | 5 < 3 → false |
>= | 大于等于 | 5 >= 3 → true |
<= | 小于等于 | 5 <= 3 → false |
== | 等于 | 5 == 3 → false |
!= | 不等于 | 5 != 3 → true |
关系运算符的结果是布尔类型(bool),只有 true(真)或 false(假)两个值。
cpp
int x = 5, y = 7;
cout << (x < y) << endl; // 输出 1(true)
cout << (x == y) << endl; // 输出 0(false)TIP
cout 输出布尔值时会显示 1(表示 true)或 0(表示 false),而不是直接显示 true / false。
2. if 单分支结构
语法:
cpp
if (条件) {
// 条件为真时执行的代码
}条件是一个表达式,结果必须是bool类型。- 如果条件为
true,执行{}里的代码块。 - 如果条件为
false,跳过代码块,继续往下执行。
示例:判断一个数是否为正数
cpp
#include <iostream>
using namespace std;
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
if (num > 0) {
cout << "这是一个正数。" << endl;
}
cout << "程序结束。" << endl;
return 0;
}输入 5 时输出:
这是一个正数。
程序结束。输入 -3 时输出:
程序结束。TIP
如果 if 后面的代码块只有一条语句,可以省略大括号 {},但强烈建议一直写大括号,这样代码更清晰,也方便以后添加语句。
cpp
if (num > 0)
cout << "正数" << endl; // 合法但不建议省略 {}3. if-else 双分支结构
语法:
cpp
if (条件) {
// 条件为真时执行
} else {
// 条件为假时执行
}if和else是"二选一"——只能执行其中一个分支。
示例:判断奇偶数
cpp
#include <iostream>
using namespace std;
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
if (num % 2 == 0) {
cout << num << " 是偶数。" << endl;
} else {
cout << num << " 是奇数。" << endl;
}
return 0;
}输入 7 时输出:
7 是奇数。输入 10 时输出:
10 是偶数。TIP
使用 num % 2 == 0 判断偶数,因为能被 2 整除的数是偶数。记住:取余运算符 % 返回除法后的余数。
4. if-else if-else 多分支结构
语法:
cpp
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件1为假且条件2为真时执行
} else if (条件3) {
// 条件1、2为假且条件3为真时执行
} else {
// 以上所有条件均为假时执行
}- 从上到下依次判断,只要满足一个条件,就跳过后续所有分支。
if必须有,else if可以有多个,else最多有一个(也可以没有)。
示例:成绩等级判定
cpp
#include <iostream>
using namespace std;
int main() {
int score;
cout << "请输入你的成绩:";
cin >> score;
if (score >= 90) {
cout << "等级:优秀" << endl;
} else if (score >= 80) {
cout << "等级:良好" << endl;
} else if (score >= 60) {
cout << "等级:及格" << endl;
} else {
cout << "等级:不及格" << endl;
}
return 0;
}运行示例:
请输入你的成绩:85
等级:良好WARNING
注意条件的顺序非常重要!如果把 score >= 60 写在前面,那么 85 分也会先匹配到"及格",后面的"良好"和"优秀"就不会执行了。程序总是从上到下匹配第一个为真的条件。
5. 嵌套 if 结构
在 if 或 else 的代码块内部,可以再写 if 语句,这就是嵌套 if。
示例:成年且男性/女性的判断
cpp
#include <iostream>
using namespace std;
int main() {
int age;
char gender;
cout << "请输入年龄:";
cin >> age;
if (age >= 18) {
cout << "请输入性别(M/F):";
cin >> gender;
if (gender == 'M' || gender == 'm') {
cout << "成年男性" << endl;
} else if (gender == 'F' || gender == 'f') {
cout << "成年女性" << endl;
} else {
cout << "未知性别" << endl;
}
} else {
cout << "未成年人" << endl;
}
return 0;
}TIP
嵌套 if 虽然功能强大,但嵌套层次不宜过深(一般不超过 3 层),否则代码会变得难以阅读。如果嵌套太深,可以考虑用逻辑运算符 &&、|| 合并条件来简化。
6. switch 语句
当判断的条件是某个变量的多个固定值时,用 switch 比 if-else if 更清晰。
语法:
cpp
switch (表达式) {
case 值1:
// 匹配值1时执行
break;
case 值2:
// 匹配值2时执行
break;
// ... 更多 case ...
default:
// 所有 case 都不匹配时执行
break;
}表达式的结果必须是整型(int、char等)或枚举类型。case后面的值必须是常量,不能是变量。break用于跳出switch。如果没有break,会继续执行下一个case(称为"穿透")。default是可选的,相当于if中的else。
示例:根据星期几输出不同的提示
cpp
#include <iostream>
using namespace std;
int main() {
int day;
cout << "请输入星期几(1-7):";
cin >> day;
switch (day) {
case 1:
cout << "星期一,新的一周开始了!" << endl;
break;
case 2:
cout << "星期二,加油!" << endl;
break;
case 3:
cout << "星期三,一周过半了!" << endl;
break;
case 4:
cout << "星期四,坚持住!" << endl;
break;
case 5:
cout << "星期五,马上周末了!" << endl;
break;
case 6:
cout << "星期六,好好休息!" << endl;
break;
case 7:
cout << "星期日,准备迎接新的一周!" << endl;
break;
default:
cout << "输入错误,请输入 1-7 之间的数字。" << endl;
break;
}
return 0;
}关于 break 和穿透现象:
如果故意省略 break,程序会"穿透"到下一个 case 继续执行,直到遇到 break 或 switch 结束。
cpp
int score = 85;
switch (score / 10) {
case 10:
case 9:
cout << "优秀" << endl; // score >= 90
break;
case 8:
case 7:
case 6:
cout << "及格" << endl; // 60 <= score <= 89
break;
default:
cout << "不及格" << endl; // score < 60
break;
}利用穿透,可以让多个 case 共享同一段代码。
NOTE
switch 适合判断一个变量的固定取值(比如星期几、月份、菜单选项等)。 如果需要判断范围(如 score >= 60),用 if-else if 更合适。
7. if 和 switch 的对比
| 特性 | if 语句 | switch 语句 |
|---|---|---|
| 适用场景 | 范围判断、复杂逻辑条件 | 固定值的多分支选择 |
| 条件类型 | 任意布尔表达式 | 整型、字符型、枚举型 |
| 可读性 | 条件复杂时可读性较差 | 多个固定值时结构清晰 |
| 灵活性 | 更灵活,支持嵌套和复合逻辑 | 较严格,case 值必须是常量 |
| 性能 | 逐个判断 | 可以跳转优化,多个 case 时更快 |
TIP
初学阶段,建议首选 if 系列语句。当你发现有一大堆 else if 都在判断同一个变量的不同值的时候,可以考虑换成 switch。
8. 小结
if单分支:如果条件成立,就执行某段代码。if-else双分支:二选一,条件成立走if,否则走else。if-else if-else多分支:多选一,从上到下匹配第一个成立的条件。- 嵌套 if:if 里面再套 if,注意层次不要太深。
switch语句:适合判断变量的多个固定值,记得加break避免穿透。- 关系运算符的结果是
bool类型(true/false)。
9. 练习
简单判断:输入一个整数,判断它是否大于 0。如果大于 0,输出"正数"。
奇偶判断:输入一个整数,判断它是奇数还是偶数。
最大值:输入三个整数,输出其中最大的那个数。
成绩等级:输入一个成绩(0~100),输出对应的等级:
- 90~100 → 优秀
- 80~89 → 良好
- 60~79 → 及格
- 0~59 → 不及格
- 其他 → 输入错误
季节判断:输入一个月份(1~12),用
switch输出对应的季节:- 3~5 月 → 春天
- 6~8 月 → 夏天
- 9~11 月 → 秋天
- 12、1、2 月 → 冬天
- 其他 → 输入错误
闰年判断:输入一个年份,判断它是否为闰年。
闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。
挑战题:简易计算器:输入两个整数和一个运算符(
+、-、*、/),用switch输出运算结果。如果除数为 0,输出"错误:除数不能为 0"。