📄 一句话概括
第四章解决的是同一个问题:让程序"看情况办事"。四块拼图——决策分支(4.1:条件+预案的思维模型)、三种 if(4.2:做不做 / 二选一 / 多档选一)、三目与 switch(4.3~4.4:挑值版分支 / 对号入座版分支)、嵌套(4.5:层层设卡,&& || 能拉平)。第三章给了真假,本章用真假开车;第五章循环 = 让"看情况"回头再来一次。
一、本章知识地图
| 块 | 小节 | 一句话要点 |
|---|---|---|
| 思维模型 | 4.1 | 决策 = 条件 + 预案;条件是 bool 表达式 |
| 三种 if | 4.2 | 单分支(真才做);双分支(两路必走其一);阶梯(逐级查·命中即走·else 兜底) |
| 4.2.1 | 实例01 判奇数:n % 2 != 0(防负数坑) |
|
| 4.2.2 | 实例02 判优秀:else 不带条件;两块互斥 | |
| 4.2.3 | 实例03 划等级:顺序即逻辑,从严到宽 | |
| 挑值版 | 4.3 | ? : 整体是值、只放值;整体套括号 |
| 对号入座版 | 4.4 | case 常量跳板 + break 闸门;漏写穿透不报错 |
| 嵌套 | 4.5 | 实例06 三层筛闰年;实例07 && \|\| 一条语句拉平 |
二、必须记住的五个结论
- 条件后面别加分号——
if (a > 5);的分号是空语句,真代码反而无条件执行;编译器警告别无视 - 多分支条件从严到宽排——阶梯的隐含条件 = 上面全没中;顺序打乱就被宽条件截胡
- 测试要喂边界——90/89、60/59、闰年 1900/2000:边界是条件 bug 高发区,每片叶子都要喂到
- switch 只对离散点、break 别忘写——范围判断回 if 阶梯;漏 break 是"不报错的运行错误"
- 嵌套超三层用
&&||拉平——嵌套是结构、逻辑运算符是内容,两版等价;可读性优先
三、动手 Demo:两关自测
第一关(写程序):BMI 健康分级——输入身高(米)体重(公斤),算 BMI = 体重 / 身高²,低于 18.5 偏瘦、18.5~23.9 正常、24~27.9 偏胖、28 及以上肥胖。
#include <iostream>
using namespace std;
int main() {
double h, w;
cout << "请输入身高(米)和体重(公斤):";
cin >> h >> w;
double bmi = w / (h * h);
cout << "BMI = " << bmi << ":";
if (bmi < 18.5)
cout << "偏瘦" << endl;
else if (bmi < 24)
cout << "正常" << endl;
else if (bmi < 28)
cout << "偏胖" << endl;
else
cout << "肥胖" << endl;
return 0;
}
看到什么算成功:输入 1.7 60 输出"正常"(BMI≈20.8);1.7 85 输出"肥胖"。卡住回看:阶梯从严到宽(4.2.3)、h*h 为什么不写 h^2(3.1.5)。
第二关(找错):下面这段四处问题,分别在哪?
#include <iostream>
using namespace std;
int main() {
int score = 85;
if (score = 100);
cout << "满分" << endl;
else (score < 60)
cout << "不及格" << endl;
switch (score) {
case score > 80:
cout << "良好" << endl;
}
return 0;
}
答案(四处):
if (score = 100);——两连坑:=手滑(偷改成 100、恒真)+ 分号空语句else (score < 60)——else 不带条件,直接报错case score > 80:——case 只认常量,范围判断是 if 阶梯的活- (暗坑)就算编译过了,
switch漏default且漏break的习惯会在大程序里酿穿透事故
30 秒实验:四处全改对后,程序输出"满分"吗?——不:score 是 85,85 == 100 假,什么都不输出。再喂 score = 100 验证真路。
四、常见误区(本章汇总)
- "编译通过 = 逻辑对"——本章又三连:分号坑、穿透、条件打乱全都不报错。每组条件喂真/假两个输入是分支程序的基本功
- "三目能写语句"——
? :两边只能放值;要动作用 if-else - "嵌套是深度指标"——超过三层先想能不能用逻辑运算符拉平(实例07 演示过了)
- "else 是必需品"——单分支可以没有 else;但"全不中什么都不做"要确认正是你要的语义
自测五问(点开对答案)
1. `if (x = 5)` 有什么后果?——赋值 5(非 0 即真)恒走真路,且 x 数据被污染。 2. 阶梯第二级 `else if (s >= 80)` 的隐含条件?——`s < 90`(上面全没中)。 3. `cout << (a > b ? a : b);` 输出什么?——a、b 中较大者;括号不可省(`<<` 高于 `? :`)。 4. switch 里忘写 break 会怎样?——穿透到下一 case 继续执行,编译不报错。 5. 2100 年是闰年吗?——不是:被 100 整除且不能被 400 整除(2100 % 400 = 100)。- ☑ 第五章 循环语句 —— 已完结:小结(循环 = 让"看情况办事"回头再来一次)
相关笔记
- 小结 —— 上一章知识地图(真假的来源)
- 第三种形式的判断语句 —— 本章第一主战场
- 判断语句的嵌套 —— 结构与逻辑的打通点
- 小结 —— 下一章知识地图:分支回头再来一次
- 🔷 C++基础 · 索引 —— 全课路线图