switch 是一种多路分支结构,它允许一个变量或表达式与一系列值进行比较,并根据匹配的值执行相应的代码块,它可以看作是 if-else if-else 链的一种更清晰、更高效的替代方案,特别是在处理多个离散的整型值时。

(图片来源网络,侵删)
switch 语句的基本语法
switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时,执行的代码
break;
case constant2:
// 当 expression 的值等于 constant2 时,执行的代码
break;
case constant3:
// 当 expression 的值等于 constant3 时,执行的代码
break;
default:
// expression 的值与所有 case 都不匹配时,执行的代码
break;
}
语法要点解析:
switch (expression):expression是一个整型表达式(在 C 语言中,这包括int,char,short,long等以及它们的unsigned版本),它不能是浮点型(float,double)。case constant::constant必须是一个常量或常量表达式(如10, 'A',2*5),每个case后面的值必须是唯一的,不能有重复。break;: 这是switch语句中极其重要的一部分!break语句的作用是立即终止switch语句的执行,程序将跳转到switch代码块后面的第一条语句,如果某个case后面没有break,程序会“掉落”(fall-through)并继续执行下一个case的代码,直到遇到一个break或switch代码块结束。default::default是一个可选的分支。expression的值与任何一个case都不匹配,程序就会执行default后面的代码。default的位置可以任意放置,但通常放在最后,它类似于if-else结构中的else。
switch 语句的执行流程
- 计算
switch后面的expression的值。 - 将这个计算结果与第一个
case的常量进行比较。 - 如果匹配,则执行该
case后面的所有代码,直到遇到break或switch代码块结束。 - 如果不匹配,则跳到下一个
case进行比较。 - 如果所有
case都不匹配,并且存在default分支,则执行default后面的代码。 - 如果没有
default分支且所有case都不匹配,则switch语句什么也不做,程序继续执行switch代码块后面的语句。
代码示例
示例 1:基本用法(带 break)
这是一个最常见、最标准的用法,每个 case 都有自己的 break。
#include <stdio.h>
int main() {
int day = 3;
char dayName[20];
switch (day) {
case 1:
strcpy(dayName, "Monday");
break;
case 2:
strcpy(dayName, "Tuesday");
break;
case 3:
strcpy(dayName, "Wednesday");
break;
case 4:
strcpy(dayName, "Thursday");
break;
case 5:
strcpy(dayName, "Friday");
break;
case 6:
strcpy(dayName, "Saturday");
break;
case 7:
strcpy(dayName, "Sunday");
break;
default:
strcpy(dayName, "Invalid day");
break;
}
printf("Day %d is %s\n", day, dayName); // 输出: Day 3 is Wednesday
return 0;
}
分析: day 的值是 3,与 case 3: 匹配,执行 strcpy 语句,然后遇到 break,switch 语句结束。
示例 2:“掉落”(Fall-Through)特性
“掉落”特性是有用的,判断一个字符是否为元音字母。

(图片来源网络,侵删)
#include <stdio.h>
int main() {
char ch = 'e';
int isVowel = 0; // 0 代表假,1 代表真
switch (ch) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
isVowel = 1;
break;
default:
isVowel = 0;
break;
}
if (isVowel) {
printf("%c is a vowel.\n", ch); // 输出: e is a vowel.
} else {
printf("%c is not a vowel.\n", ch);
}
return 0;
}
分析: ch 是 'e',程序进入 case 'a':,发现没有 break,于是继续向下执行,进入 case 'e':,匹配成功,设置 isVowel = 1,然后遇到 break,退出 switch,这种写法比多个 if-else if 更简洁。
示例 3:没有 break 的情况(危险!)
忘记写 break 是一个非常常见的错误。
#include <stdio.h>
int main() {
int grade = 2;
switch (grade) {
case 1:
printf("Grade 1: Excellent\n");
break; // grade 是 1,会执行到这里并退出
case 2:
printf("Grade 2: Good\n");
// 故意忘记 break
case 3:
printf("Grade 3: Pass\n");
break;
default:
printf("Invalid grade\n");
break;
}
return 0;
}
分析: grade 是 2,程序会:
- 匹配
case 2:,打印"Grade 2: Good"。 - 因为没有
break,程序继续执行下一个case,即case 3:,打印"Grade 3: Pass"。 - 然后遇到
case 3:的break,退出switch。 输出结果:Grade 2: Good Grade 3: Pass这显然不是我们想要的结果。
switch vs. if-else if-else
| 特性 | switch 语句 |
if-else if-else 语句 |
|---|---|---|
| 比较类型 | 仅限于整型(int, char等) |
可以比较任何类型(整数、浮点数、字符串等) |
| 条件形式 | 与常量进行比较 | 与任意表达式进行比较 |
| 可读性 | 当有多个离散值分支时,代码更清晰、结构化 | 当分支较少或条件复杂时,代码更自然 |
| 执行效率 | 在某些情况下(尤其是在多分支时)可能比一长串 if-else 更高效,因为它可能使用“跳转表”实现。 |
对于简单的两三个分支,效率差别不大。 |
| 掉落特性 | 有“掉落”特性,可用于共享代码块。 | 没有“掉落”特性,每个 else if 都是独立的。 |
何时使用 switch?
当你需要根据一个整型变量的多个离散值来执行不同的操作时,switch 是最佳选择。
- 菜单选择 (
case 1: ... case 2: ...) - 状态机 (
case IDLE: ... case RUNNING: ...) - 错误码处理 (
case 404: ... case 500: ...)
何时使用 if-else if-else?
- 当你需要比较范围时(如
if (score >= 90 && score <= 100))。 - 当你需要比较浮点数时。
- 当条件是复杂的逻辑表达式时。
- 当分支数量很少时(例如只有2-3个)。
switch 是 C 语言中一个强大而优雅的工具,用于处理多路分支逻辑,理解其核心要点至关重要:
- 表达式必须是整型。
case后面必须是常量。break是控制流程的关键,用于防止“掉落”。default提供了“其他情况”的处理。- 善用“掉落”特性可以写出更简洁的代码(如判断元音)。
正确使用 switch 可以让你的代码更加清晰、易读且易于维护。
