本讲定位:一级要求”会用分支”,二级要求”分支套分支还不乱”。官方大纲的措辞是”掌握多层分支结构,掌握
if语句、if...else语句、switch语句,及相互嵌套的方法”——“相互嵌套”四个字是二级相对一级唯一的新增内容。真题里这一块的形态很固定:给一段嵌套很深的代码,问输出。考的不是语法,是你能不能在脑子里理清层次。本讲会给出两个可靠的工具:缩进树和条件累积表。对应官方大纲:二级知识块 6「多层分支结构」——
if语句、if...else语句、switch语句的嵌套。前置知识:一级第 06 讲(关系与逻辑运算)、第 07 讲(
if、if-else、else if、switch的基本用法与三大陷阱)。本讲是一级第 07 讲的直接加深,那一讲的三个陷阱在这里会被放大。代码说明:本讲所有代码均已用 g++ 11.5(
-std=c++11)编译运行验证,输出结果即为文中标注结果。
int a = 5, b = 3, c = 8;
if (a > b) {
if (b > c) {
cout << "1";
} else {
cout << "2";
}
} else {
if (a > c) {
cout << "3";
} else {
cout << "4";
}
}
输出是什么?
答案是 2。
外层:a > b → 5 > 3 成立,走上半支(下半支的 3 和 4 直接出局);
内层:b > c → 3 > 8 不成立,走 else → 输出 2。
💡 读嵌套的关键:一旦某一层的分支定了,另一半的所有代码——不管里面套了多少层——全部作废。 这就是本讲的核心思维。
if 里面套 if)用于”层层递进”的判断——先判一个条件,成立之后在这个前提下再判第二个。
if (条件1) {
if (条件2) {
// 条件1 成立 且 条件2 成立
} else {
// 条件1 成立 但 条件2 不成立
}
} else {
// 条件1 不成立
}
else if 链)用于”若干互斥情况”的分类——一级第 07 讲学过的成绩分等级就是这种。
if (条件1) {
...
} else if (条件2) {
...
} else if (条件3) {
...
} else {
...
}
📌 一个重要认识:
else if其实也是嵌套。if (A) { ... } else if (B) { ... } else { ... }完全等价于
if (A) { ... } else { if (B) { ... } else { ... } }
else if只是把”在 else 里再放一个 if”写成了一行,省掉了层层加深的缩进。 理解这一点,就能明白为什么else if链天然自带”排除前面所有情况”的效果(一级第 07 讲 4.3 节)。
| 情况 | 用什么 |
|---|---|
| 若干互斥的类别(等级、月份、分段计费) | else if 链 |
| 层层递进的条件(先看性别,再看年龄) | 真嵌套 |
| 两个条件必须同时成立才做某事 | && 合并成一个 if(最简洁) |