📄 一句话概括
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 根本不算——嵌套版的"外层挡住里层",一条语句版由短路机制天然复刻。
四、常见误区
- "else 跟最近的 if 配对,想当然"——语言规则就是就近配对。不用大括号时
if (a) if (b) ... else ...的 else 归里层 if 管——嵌套永远写大括号,歧义无从谈起。 - "嵌套越深越严谨"——超过三层就该警觉(实例06 三层已经到头了)。多数深嵌套能像实例07 那样用
&&||拉平,可读性立刻回升。 - "测试随便喂个数就行"——闰年这类多层判断必须喂满每片叶子(2023/2024/1900/2000 各走一路),少一片叶子的测试就有藏 bug 的死角。
自测三问(点开对答案)
1. 外层 if 为假时,嵌在里面的 if 执行吗?——不执行,整个里层被跳过。 2. "嵌套先过 A 再看 B"翻译成逻辑运算符是什么?——`A && B`;"两条路都算闰年"是 `||`。 3. 1900 和 2000 为什么一个平一个闰?——都能被 100 整除,但只有 2000 能被 400 整除。- ☐ 4.6 小结(下一节)
相关笔记
- 第三种形式的判断语句 —— 拉平深嵌套的另一种武器
- 逻辑运算符 —— 实例07 的全部家底
- 🔷 C++基础 · 索引 —— 全课路线图