当程序要把同一个值与多个固定选项比较时,switch 通常比很长的 if-else if 链更清楚。C 会先计算 switch 括号中的选择值,再跳到匹配的 case。
基本结构
每个 case 后写一个常量和冒号。匹配后执行该分支中的语句;break 结束整个 switch;default 处理没有任何 case 匹配的情况。
int day = 4;
switch (day) {
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
case 7:
printf("Weekend\n");
break;
default:
printf("Invalid day\n");
}这个例子完整覆盖星期一到星期日。case 6 和 case 7 连续排列并共享同一个代码体,这是有意使用贯穿来合并相同结果。
break 与贯穿
如果一个 case 执行完却没有 break,控制流会继续进入后面的 case,这叫 fall-through。除非多个选项确实需要共享逻辑,否则应在每个独立分支末尾写 break。
case 标签必须是整型常量表达式,并与选择值类型兼容。switch 的选择值使用整数、字符或枚举,不能直接使用字符串或 double。
执行顺序
- 计算 switch 的选择值。
- 寻找值相等的 case;找不到则进入 default。
- 从匹配位置开始执行语句。
- 遇到 break 或 switch 末尾时退出。
互动实验
switch 单步调试器
访问权限免费
选择会员等级,然后点击高亮代码行或“运行当前行”。每次只执行一条语句,变量和控制台会同步变化。
创建 tier,值为 2。
知识测验
题目
如果 case 执行后没有 break,通常会发生什么?
动手练习
制作会员折扣结算器
读取会员等级和订单原价,用 switch 设置折扣率,再计算顾客的实际应付金额。
- 读取整数会员等级 tier 和订单原价 amount。
- 普通会员 0 级不打折,1、2、3 级会员分别享受 5%、10%、15% 折扣。
- 用 switch 给 discount 赋值;无效等级需要输出提示并结束程序。
- 根据 amount * (1 - discount) 计算应付金额,并保留两位小数输出。