第四章——选择结构 第六节——switch-break语句及其构成的选择结构

第四章——选择结构 第六节——switch-break语句及其构成的选择结构

亓翎_Re-Tikara Lv5

1. 什么是switch-break语句?

  switch-break是C语言中用于多分支选择的控制结构,它通过匹配一个表达式的值,决定执行哪一段代码。

  • 核心思想:像“服务员根据顾客点的菜名做对应的菜”。
  • switch:服务员,根据输入的值(菜名)决定做什么。
  • case:菜单上的每一道菜(具体选项)。
  • break:做完这道菜就停下(否则会继续做后面的菜!)。
  • default:如果没点任何列出的菜,就默认做奶茶(兜底选项)。

2. 语法结构

1
2
3
4
5
6
7
8
9
10
11
12
switch (表达式) {
case1:
执行代码1;
break;
case2:
执行代码2;
break;
...
default:
默认执行代码;
break;
}
  • 表达式:必须是整型或字符型(如intchar)。
  • case:每个值必须是固定常量(不能是变量)。
  • break:跳出switch,否则会继续执行后续case(穿透效应)。
  • default:可选的默认分支,处理所有未匹配的情况。

3. default的作用

  • 兜底选项:当所有case都不匹配时执行default
  • 场景举例
    • 用户点了菜单上没有的菜 → 推荐默认菜品(奶茶)。
    • 程序接收到未知状态码 → 提示“请检查输入”。

4. 生活中的例子

例1:点餐系统

1
2
3
4
5
6
7
int choice = 2; // 用户点了“2”
switch (choice) {
case 1: printf("牛肉面已下单!\n"); break;
case 2: printf("炒饭已下单!\n"); break;
case 3: printf("奶茶已下单!\n"); break;
default: printf("抱歉,暂时没有这道菜。\n");
}
  • 输出炒饭已下单!
  • 如果用户输入4抱歉,暂时没有这道菜。default生效)

例2:交通信号灯

1
2
3
4
5
6
7
int light = 2; // 1=红灯,2=黄灯,3=绿灯
switch (light) {
case 1: printf("红灯:请停车!\n"); break;
case 2: printf("黄灯:准备通行!\n"); break;
case 3: printf("绿灯:可以通行!\n"); break;
default: printf("信号灯故障,请小心!\n");
}
  • 如果light=4:输出信号灯故障,请小心!default兜底)

5. switchif-else的区别

场景 switch if-else
适用类型 整型、字符型 所有类型(包括浮点、字符串)
多分支效率 更高效(直接跳转) 逐个判断条件
穿透效应 存在(需注意break
默认处理 default兜底未匹配情况 else处理未匹配情况

6. 常见错误与避坑指南

坑1:忘记加break导致“穿透效应”

1
2
3
4
5
switch (choice) {
case 1: printf("牛肉面\n");
case 2: printf("炒饭\n");
default: printf("奶茶\n");
}
  • 如果choice=1,输出:
    1
    2
    3
    牛肉面
    炒饭
    奶茶
    原因:没有break,程序会继续执行后续case,直到遇到break或结束。
  • 避坑方法:每个case后都加break,除非有意设计穿透(如合并选项)。

坑2:default的位置影响执行流程

1
2
3
4
5
switch (x) {
case 1: printf("1\n"); break;
default: printf("default\n");
case 2: printf("2\n"); break;
}
  • 如果x=2,程序会先执行default,再执行case 2,因为default不在最后。
  • 避坑方法:把default放在最后,避免逻辑混乱。

坑3:switch表达式类型错误

1
2
float x = 3.14;
switch (x) { ... } // ❌ 错误!只能用整型或字符
  • 原因switch的表达式必须是整数字符,不能是浮点数或字符串。

坑4:case后使用非常量

1
2
3
4
int a = 5;
switch (x) {
case a: ... // ❌ 错误!a是变量,不是常量
}
  • 原因case后面必须是固定值(如1、2、’A’),不能是变量。

7. default的典型应用场景

  1. 无效输入处理
    • 用户输入不在菜单选项中 → 提示“请重新输入”。
  2. 错误处理
    • 程序接收到未知状态码 → 提示“请检查输入”。
  3. 默认操作
    • 颜色未指定时,默认使用白色。

8. 总结

  • switch-break的核心:根据表达式的值快速匹配多个分支,default作为兜底。
  • 关键规则
    1. 表达式必须是整型或字符
    2. 每个case必须是固定值
    3. 每个case尽量加break,除非有意设计穿透。
    4. default放最后,处理未匹配的情况。
  • 记住一句话

    switch是“菜单选择器”,default是“最后的救命稻草”!


9.几点稍微正式一点的说明

  1. switchcasedefault 是 C 语言关键字,default 子句可缺省;
      2. switch 后的表达式必须为整型或字符型(如 intchar);
      3. case 后的常量表达式称为标号,标号必须互不相同,且 case 与标号间需留空格(如 case 1:);
      4. case 标号后的语句序列可以为空(仅保留冒号),但冒号不可省略;
      5. case 后的语句序列可以是单条或多条语句,多条语句无需用 {} 包裹;
      6. 多个 case 可共用同一组执行语句(实现多个标号对应相同操作),如下实例,无论输入大写还是小写,都是一样的;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

int main() {
int grade;
printf("请输入成绩等级 (A/B/C/D): ");
scanf("%c", &grade);

switch (grade) {
case 'A':
case 'a':
printf("优秀\n");
break;
case 'B':
case 'b':
printf("良好\n");
break;
case 'C':
case 'c':
printf("中等\n");
break;
case 'D':
case 'd':
printf("及格\n");
break;
default:
printf("无效输入\n");
}

return 0;
}

  7. 若未使用 break,程序会顺序执行后续所有 case 语句(包括 default),因此必须用 break 跳出当前 case
  8. switch 语句支持嵌套,内部 switch 的规则与外部一致;
  9. case 标号必须为常量表达式(如字面量、宏定义等),不能是变量或计算结果;
  10. default 子句通常放在最后,用于处理未匹配的情况;
  11. 避免因忘记 break 导致的穿透执行(fall-through)问题。

  • 标题: 第四章——选择结构 第六节——switch-break语句及其构成的选择结构
  • 作者: 亓翎_Re-Tikara
  • 创建于 : 2026-02-07 02:21:28
  • 更新于 : 2026-02-10 02:48:46
  • 链接: https://re-tikara.fun/Blog/posts/253c2b9f/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。