什么是 switch 语句?
switch 语句是一种多路分支语句,它根据一个变量的值来决定执行哪一段代码,你可以把它想象成一个多路开关,根据你传入的“信号”(变量值),接通对应的“线路”(执行代码块)。

(图片来源网络,侵删)
它通常用于替代多个 if-else if-else 语句,当需要检查同一个变量是否等于多个不同值时,switch 语句会使代码更清晰、更易读。
switch 语句的基本语法
switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时,执行这里的代码
break;
case constant2:
// 当 expression 的值等于 constant2 时,执行这里的代码
break;
case constant3:
// 当 expression 的值等于 constant3 时,执行这里的代码
break;
default:
// 当 expression 的值不匹配任何一个 case 时,执行这里的代码
break;
}
语法详解:
-
switch (expression):switch是关键字。expression是一个整型表达式(包括int,char,short,long等,C99标准后也支持long long)。注意:float,double,string等类型不能直接用于switch。- 这个表达式的值会与下面每个
case后面的常量进行比较。
-
case constant::case是关键字。constant必须是一个常量或常量表达式(不能是变量),1, 'A',10 + 20,它的类型必须和switch的expression类型兼容。expression的值与某个case的constant相等,程序就会从这个case的标签()之后开始执行代码。
-
break;:
(图片来源网络,侵删)- 这是
switch语句中极其重要的一部分! break语句的作用是立即跳出整个switch语句,防止程序继续执行下一个case中的代码。- 如果省略了
break,程序会“穿透”(fall-through)到下一个case中继续执行,直到遇到一个break语句或者switch语句的结束大括号 ,这有时是故意的(见下面的“特性”部分),但大多数情况下是疏忽导致的 bug。
- 这是
-
default::default是可选的,但强烈推荐使用。expression的值不匹配任何一个case后面的常量,程序就会执行default标签下的代码。- 它类似于
if-else结构中的else部分,通常放在switch语句的最后。
一个简单的例子
这个例子根据一个学生的分数(简化为1-5分)来评定等级。
#include <stdio.h>
int main() {
int score = 3; // 假设学生得了3分
switch (score) {
case 5:
printf("优秀!\n");
break;
case 4:
printf("良好!\n");
break;
case 3:
printf("及格!\n");
break;
case 2:
case 1: // 可以合并多个 case,执行相同的代码
printf("不及格!\n");
break;
default:
printf("无效的分数!\n");
break;
}
return 0;
}
执行结果:
及格!
代码分析:

(图片来源网络,侵删)
score的值是3。switch语句开始匹配,case 5不匹配,case 4不匹配。case 3匹配成功,程序开始执行printf("及格!\n");。- 遇到
break;语句,程序立即跳出switch结构,main函数结束。
switch 的核心特性:case 穿透
这是 switch 语句一个非常重要的特性,也是初学者最容易出错的地方。
case 分支中没有 break 语句,程序会继续执行下一个 case 的代码,而不会进行新的匹配。
例子:
#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。case 2匹配成功,执行printf("星期二\n");。- 因为没有
break,程序没有跳出switch,而是继续向下执行。 - 它没有检查
case 3是否匹配,而是直接执行了case 3的代码printf("星期三\n");。 - 然后遇到
break,跳出switch。
何时会用到“穿透”?
虽然大多数情况下 break 是必需的,但有时“穿透”特性是有用的,在之前的分数例子中,case 2 和 case 1 需要执行相同的代码。
case 2:
case 1:
printf("不及格!\n");
break;
当 score 是 2 或 1 时,都会执行 printf 语句。
switch vs. if-else if-else
如何选择使用哪个?
| 特性 | switch 语句 |
if-else if-else 语句 |
|---|---|---|
| 判断条件 | 只能判断一个整型表达式的离散值。 | 可以判断任意类型的表达式(如 x > 5, strcmp(s1, s2) == 0),可以进行范围判断。 |
| 可读性 | 当需要判断多个离散值时,代码结构更清晰,可读性更高。 | 判断条件复杂或较少时,可读性很好,条件过多时,会显得冗长。 |
| 灵活性 | 较低,只能做“等于”的判断。 | 极高,可以做 >, <, , , &&, 等各种复杂的逻辑组合。 |
| 执行效率 | 在某些编译器和场景下,switch 可能会生成更高效的跳转表(jump table)代码,比一连串的 if-else 更快。 |
效率取决于条件的顺序,最坏情况下(条件不满足),需要检查所有条件。 |
选择建议:
- 优先使用
switch:当你需要检查同一个整型变量是否等于几个固定的值时(根据菜单选项、状态码、星期几等)。 - 使用
if-else if-else:当你需要判断的范围、类型或逻辑比较复杂时(判断成绩是否在 90-100 之间,判断字符串是否相等,或者需要组合多个条件)。
- 基本用途:根据一个整型变量的值,从多个代码分支中选择一个执行。
- 核心结构:
switch(expression) { case const: ... break; default: ... break; } break的关键作用:防止case之间的代码“穿透”,执行完一个case后必须用break跳出。default的作用:处理所有case都不匹配的“默认”情况。- 适用场景:判断一个变量是否等于几个离散的整数值,此时比
if-else更清晰。 - 不适用场景:判断浮点数、字符串、或者需要范围判断(如
x > 10)的情况,应使用if-else。
掌握 switch 语句是 C 语言编程的基础,理解其工作原理,特别是 break 语句的作用,对于编写正确、高效的代码至关重要。
