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

第四章解决的是同一个问题:让程序"看情况办事"。四块拼图——决策分支(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 && \|\| 一条语句拉平

二、必须记住的五个结论

  1. 条件后面别加分号——if (a > 5); 的分号是空语句,真代码反而无条件执行;编译器警告别无视
  2. 多分支条件从严到宽排——阶梯的隐含条件 = 上面全没中;顺序打乱就被宽条件截胡
  3. 测试要喂边界——90/89、60/59、闰年 1900/2000:边界是条件 bug 高发区,每片叶子都要喂到
  4. switch 只对离散点、break 别忘写——范围判断回 if 阶梯;漏 break 是"不报错的运行错误"
  5. 嵌套超三层用 && || 拉平——嵌套是结构、逻辑运算符是内容,两版等价;可读性优先

三、动手 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;
}

答案(四处):

  1. if (score = 100);——两连坑:= 手滑(偷改成 100、恒真)+ 分号空语句
  2. else (score < 60)——else 不带条件,直接报错
  3. case score > 80:——case 只认常量,范围判断是 if 阶梯的活
  4. (暗坑)就算编译过了,switch 漏 default 且漏 break 的习惯会在大程序里酿穿透事故

30 秒实验:四处全改对后,程序输出"满分"吗?——不:score 是 85,85 == 100 假,什么都不输出。再喂 score = 100 验证真路。

四、常见误区(本章汇总)

  1. "编译通过 = 逻辑对"——本章又三连:分号坑、穿透、条件打乱全都不报错。每组条件喂真/假两个输入是分支程序的基本功
  2. "三目能写语句"——? : 两边只能放值;要动作用 if-else
  3. "嵌套是深度指标"——超过三层先想能不能用逻辑运算符拉平(实例07 演示过了)
  4. "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)。

相关笔记