GESP 二级 第 06 讲:多层分支结构与嵌套

本讲定位一级要求”会用分支”,二级要求”分支套分支还不乱”。官方大纲的措辞是”掌握多层分支结构,掌握 if 语句、if...else 语句、switch 语句,及相互嵌套的方法”——“相互嵌套”四个字是二级相对一级唯一的新增内容。真题里这一块的形态很固定:给一段嵌套很深的代码,问输出。考的不是语法,是你能不能在脑子里理清层次。本讲会给出两个可靠的工具:缩进树条件累积表

对应官方大纲:二级知识块 6「多层分支结构」——if 语句、if...else 语句、switch 语句的嵌套。

前置知识:一级第 06 讲(关系与逻辑运算)、第 07 讲(ifif-elseelse ifswitch 的基本用法与三大陷阱)。本讲是一级第 07 讲的直接加深,那一讲的三个陷阱在这里会被放大。

代码说明:本讲所有代码均已用 g++ 11.5(-std=c++11)编译运行验证,输出结果即为文中标注结果。


1. 先看一道嵌套读程序题

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 > b5 > 3 成立,走上半支(下半支的 3 和 4 直接出局); 内层:b > c3 > 8 不成立,走 else → 输出 2

💡 读嵌套的关键:一旦某一层的分支定了,另一半的所有代码——不管里面套了多少层——全部作废。 这就是本讲的核心思维。


2. 嵌套的两种形态

2.1 形态一:真嵌套(if 里面套 if

用于”层层递进”的判断——先判一个条件,成立之后在这个前提下再判第二个。

if (条件1) {
    if (条件2) {
        // 条件1 成立 且 条件2 成立
    } else {
        // 条件1 成立 但 条件2 不成立
    }
} else {
    // 条件1 不成立
}

2.2 形态二:并列多分支(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 节)。

2.3 什么时候用哪个

情况 用什么
若干互斥的类别(等级、月份、分段计费) else if
层层递进的条件(先看性别,再看年龄) 真嵌套
两个条件必须同时成立才做某事 && 合并成一个 if(最简洁)