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

switch 是多分支的另一套写法:拿一个值去"对号入座"——跳到匹配的那个 case 执行,break 是每层的闸门,漏写就一路穿透到底。范围判断(>80)它干不了,离散点匹配(菜单选 1/2/3、按键响应)是它的主场。

一、语法与执行流程

char c;
cin >> c;
switch (c) {
    case 'a':
        cout << "苹果" << endl;
        break;              // 闸门:干完跳出 switch
    case 'b':
        cout << "香蕉" << endl;
        break;
    default:                // 全都不匹配的兜底
        cout << "未知" << endl;
}

执行顺序(对着图看):先算 switch 括号里的值 → 跳到值相等的那个 case(不是从上往下试!)→ 执行到 break 跳出整个 switch → 全不匹配走 default。

四个硬规矩:

  1. case 后必须是常量——case 'a'、case 1 行;case x(变量)、case score >= 60(范围)都不行。判范围是 if-else if 的活。
  2. break 别忘写——不写就"穿透"(fall-through):本层干完接着执行下一层代码,直到撞见 break 或开关结束。
  3. switch 括号里只能是整型、字符、枚举——double、string 都不行(浮点无精确匹配可言,字符串是对象)。
  4. default 位置随意,但惯例放最后;它也不需要 break(后面没层了)。

二、实例 05:根据输入的字符输出字符串

就是上面的代码:输入 a → "苹果";b → "香蕉";x → "未知"。

故意玩一次穿透:把 case 'a' 的 break 删掉,输入 a——输出"苹果"和"香蕉"两行。a 层干完没闸门,顺楼梯掉进了 b 层。这解释了为什么菜单程序里偶尔会见到故意不写 break 的写法:

case 'A':
case 'a':                   // 大小写共用一段代码:A 穿透到 a
    cout << "苹果" << endl;
    break;

三、30 秒实验:穿透现场

写一个没有 break 的三 case 开关,输入第一个值,数数输出几行。再把 break 逐个加回去,看输出一行行变少——break 的作用不用背,亲手关一次闸门就懂了。

四、常见误区

  1. "case 写范围 case 90..100"——不存在的。switch 只认离散常量点,范围判断回 4.2.3。
  2. "忘写 break 编译器会报错"——不报,是运行结果错(穿透)。最阴的一类 bug,靠测试每个分支才能抓到。有人给"故意穿透"写 // fall through 注释,防止同事当成漏写。
  3. "switch 和 if-else if 谁更好"——看场景:离散点匹配用 switch(清晰、编译器还能优化成跳转表);范围判断、复杂逻辑条件(&& || 拼的)用 if 阶梯。各干各的活。
自测三问(点开对答案) 1. switch 括号里能放 double 吗?——不能,只收整型/字符/枚举。 2. 漏写 break 会怎样?——穿透:本 case 执行完继续执行下一 case 的代码,直到遇 break 或结束;编译不报错。 3. `case 'A': case 'a':` 连写是什么技巧?——利用穿透让两个标签共用同一段代码。

相关笔记