🔷 第四章 条件判断语句
📄 一句话概括

if 的大括号里还能再放 if,这就是嵌套——先过外层关,再查里层事。两个闰年实例是绝配:实例06 用三层嵌套一步一步筛,实例07 用逻辑运算符把三层拉平成一条语句——结构(嵌套)和内容(&& ||)是同一件事的两种表达。

一、嵌套:先过外层,再查里层

if (外层条件) {
    if (里层条件) {
        // 外层真 且 里层真 才会到这里
    }
}

执行逻辑:外层条件为假时,里层根本不会执行——嵌套天然表达"先满足甲,才谈得上乙"。大括号是作用域边界(2.1.5),里层变量外层看不见,反之可以。

缩进就是嵌套的地图:每深一层缩进一次,配对关系一眼可见。大括号永远成对写——先写 { } 再往里填代码,是最不容易漏的写法。

二、实例 06:判断闰年(嵌套版)

闰年规则:能被 4 整除;但被 100 整除的不是;可被 400 整除的又是(1900 平、2000 闰、2024 闰)。

#include <iostream>
using namespace std;

int main() {
    int year;
    cout << "请输入年份:";
    cin >> year;

    if (year % 4 == 0) {                 // 第一关:4 的倍数
        if (year % 100 != 0) {           // 第二关:不是 100 的倍数 → 闰
            cout << year << " 是闰年" << endl;
        } else {
            if (year % 400 == 0) {       // 第三关:100 的倍数里看 400
                cout << year << " 是闰年" << endl;
            } else {
                cout << year << " 是平年" << endl;
            }
        }
    } else {
        cout << year << " 是平年" << endl;
    }
    return 0;
}

看到什么算成功:2024→闰年;2023→平年;1900→平年;2000→闰年。四个测试一个都不能少——正好覆盖判断树的每片叶子。

三、实例 07:判断闰年(一条判断语句版)

把嵌套的"先且后或"翻译成逻辑运算符:

if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    cout << year << " 是闰年" << endl;
else
    cout << year << " 是平年" << endl;

翻译对照(读懂这个,嵌套和逻辑运算符就打通了):

嵌套结构 逻辑运算符
外层真,再看里层 &&(都真才真)
两条路都通向"闰年" \|\|(一真即真)

短路求值(3.1.3)在这也上岗:year % 4 != 0 时 && 左边直接短路,右边的 % 100 根本不算——嵌套版的"外层挡住里层",一条语句版由短路机制天然复刻。

四、常见误区

  1. "else 跟最近的 if 配对,想当然"——语言规则就是就近配对。不用大括号时 if (a) if (b) ... else ... 的 else 归里层 if 管——嵌套永远写大括号,歧义无从谈起。
  2. "嵌套越深越严谨"——超过三层就该警觉(实例06 三层已经到头了)。多数深嵌套能像实例07 那样用 && || 拉平,可读性立刻回升。
  3. "测试随便喂个数就行"——闰年这类多层判断必须喂满每片叶子(2023/2024/1900/2000 各走一路),少一片叶子的测试就有藏 bug 的死角。
自测三问(点开对答案) 1. 外层 if 为假时,嵌在里面的 if 执行吗?——不执行,整个里层被跳过。 2. "嵌套先过 A 再看 B"翻译成逻辑运算符是什么?——`A && B`;"两条路都算闰年"是 `||`。 3. 1900 和 2000 为什么一个平一个闰?——都能被 100 整除,但只有 2000 能被 400 整除。

相关笔记