switch 语句简介
switch 语句是一种多路分支结构,它根据一个表达式的值,来决定执行多个代码块中的哪一个,它通常可以替代复杂的 if-else if-else 链,使代码更清晰、更易读。

(图片来源网络,侵删)
基本语法结构:
switch (expression) {
case constant_expression1:
// 代码块 1
break;
case constant_expression2:
// 代码块 2
break;
case constant_expression3:
// 代码块 3
break;
default:
// 默认代码块 (当 expression 不匹配任何 case 时执行)
break;
}
关键规则:
expression(表达式):必须是整型(int,char,long等)或枚举类型。不能是浮点数(如float,double)或字符串。case constant_expression(情况标签):每个case后面必须跟一个常量表达式(字面量、已定义的常量等),并且所有case的值必须是唯一的。default(默认情况):可选。expression的值不匹配任何一个case,程序就会执行default后面的代码块。default的位置可以任意,但通常放在最后。break语句:这是switch语句的核心,也是最容易出问题的地方。
break 语句的作用
在 switch 语句中,break 的作用是“跳出”整个 switch 结构,当程序执行到 break 语句时,会立即终止 switch 语句的执行,并跳转到 switch 语句后面的下一条语句继续执行。
为什么 break 如此重要?—— 贯穿现象
这是理解 switch 语句的关键。如果没有 break 语句,程序在执行完一个 case 分支后,会继续执行下一个 case 分支的代码,而不会进行任何判断,直到遇到 break 或 switch 语句的末尾。 这种现象称为 "fall-through"(贯穿)。

(图片来源网络,侵删)
示例:没有 break 的情况
#include <stdio.h>
int main() {
int day = 2;
switch (day) {
case 1:
printf("星期一\n");
// 没有 break
case 2:
printf("星期二\n");
// 没有 break
case 3:
printf("星期三\n");
break; // 在这里跳出
default:
printf("其他工作日\n");
break;
}
return 0;
}
输出结果:
星期二
星期三
执行流程分析:
day的值是2。switch开始匹配,case 1不匹配,跳过。case 2匹配成功,执行printf("星期二\n");。- 因为没有
break,程序没有跳出switch,而是继续向下执行。 case 3不匹配day的值,但由于是“贯穿”,它不会检查,而是直接执行其代码块printf("星期三\n");。case 3代码块执行完毕后,遇到了break,程序跳出switch结构,执行return 0;。
break 的正确使用
在绝大多数情况下,我们希望在匹配到一个 case 后,只执行该 case 的代码就立即退出。每个 case 的末尾都应该加上 break 语句。

(图片来源网络,侵删)
示例:正确的 switch 结构
#include <stdio.h>
int main() {
int score = 85;
switch (score / 10) { // 用除法来简化判断
case 10:
case 9:
printf("成绩等级: A\n");
break;
case 8:
printf("成绩等级: B\n");
break;
case 7:
printf("成绩等级: C\n");
break;
case 6:
printf("成绩等级: D\n");
break;
default:
printf("成绩等级: F (不及格)\n");
break;
}
return 0;
}
输出结果:
成绩等级: B
执行流程分析:
score是85,score / 10的结果是8。switch匹配到case 8。- 执行
printf("成绩等级: B\n");。 - 遇到
break,立即跳出switch结构,程序结束。
特别说明:case 的“贯穿”是可用的
虽然“贯穿”通常是意外,但有时我们可以巧妙地利用它,在上面的正确示例中,case 10: 后面没有 break,而是直接跟了 case 9:,这就是一种典型的用法,当 score 是 100 或 90 时,都会执行 case 9: 的代码块。
何时可以省略 break?
虽然不推荐,但在以下两种情况下可以省略 break:
- 利用“贯穿”特性:如上例所示,当多个
case需要执行相同的代码时,可以省略中间的break。 default是最后一个分支:default是switch结构中的最后一个分支,并且后面也没有其他代码需要执行,default的break可以省略,但这不是一个好的编程习惯,因为它降低了代码的可读性和可维护性。
不推荐省略 default 的 break:
// 不推荐的做法
switch (x) {
case 1: ...; break;
case 2: ...; break;
default: ...; // 没有break
}
// 如果以后要在default后面再加一个case,很容易忘记加break,导致bug。
| 概念 | 作用/规则 | 示例 | 注意事项 |
|---|---|---|---|
switch |
多路分支结构,根据表达式的值选择执行路径。 | switch (grade) |
表达式必须是整型或枚举型。 |
case |
定义一个可能的匹配值和对应的代码块。 | case 'A': ... |
值必须是唯一的常量表达式。 |
default |
当没有 case 匹配时执行的默认代码块。 |
default: ... |
可选,但推荐使用。 |
break |
跳出 switch 语句,防止“贯穿”。 |
...; break; |
每个 case 的末尾都应该有 break,除非你刻意利用“贯穿”特性。 |
核心要点:
switch+break是固定搭配,记住这个模式。- 忘记
break是 C 语言初学者最常见的错误之一,会导致逻辑混乱和不可预期的输出。 - 理解“贯穿”现象是掌握
switch语句的关键,它能帮助你写出更简洁的代码(如多个case共享代码),也能帮助你调试因忘记break而产生的错误。
