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):switch是关键字。expression是一个整型表达式(包括int,char,enum类型,以及它们的unsigned版本)。不能是浮点型(如float,double)或字符串类型。- 这个表达式的值会与下面
case标签中的常量进行比较。
-
case constant::case是关键字。constant必须是一个常量或常量表达式(10, 'A',2+3)。不能是变量。switch的表达式的值与某个case的常量值相等,程序就会从该case的位置开始执行。
-
break;:break语句的作用是跳出整个switch语句。- 如果没有
break语句,程序会继续执行下一个case的代码,这被称为"贯穿"(fall-through),在某些情况下这是有用的,但大多数情况下,忘记写break是一个常见的错误。
-
default::
(图片来源网络,侵删)default是一个可选的分支。switch表达式的值不匹配任何一个case,程序就会执行default分支的代码。default分支可以放在switch语句的任何位置,但通常放在最后,并且它本身也需要break语句(尽管它后面没有其他case,但为了代码清晰和风格统一,最好加上)。
代码示例
示例 1:基本用法(带 break)
这是一个最典型的用法,根据输入的数字(1-7)来输出星期几。
#include <stdio.h>
int main() {
int day = 3;
switch (day) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n"); // day 的值是 3,所以会执行这里
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("无效的数字\n");
break;
}
return 0;
}
输出:
星期三
示例 2:switch 的 "贯穿" 特性
我们希望多个 case 执行相同的代码块,这时就可以利用 "贯穿" 特性,省略 break。
#include <stdio.h>
int main() {
char grade = 'B';
switch (grade) {
case 'A':
printf("优秀!\n");
break;
case 'B':
case 'C':
printf("良好!\n"); // grade 是 'B' 或 'C' 时,都会执行这里的代码
break;
case 'D':
printf("及格.\n");
break;
case 'F':
printf("不及格.\n");
break;
default:
printf("无效的成绩\n");
break;
}
return 0;
}
输出 (当 grade = 'B' 时):

(图片来源网络,侵删)
良好!
示例 3:忘记 break 的错误示例
这是一个经典的错误,展示了如果没有 break 会发生什么。
#include <stdio.h>
int main() {
int number = 2;
switch (number) {
case 1:
printf("Case 1\n");
// 没有 break!
case 2:
printf("Case 2\n"); // number 是 2,匹配,开始执行
// 没有 break!
case 3:
printf("Case 3\n"); // 因为上一个 case 没有 break,所以继续执行这里
break;
default:
printf("Default\n");
break;
}
return 0;
}
输出:
Case 2
Case 3
程序从 case 2 开始执行,因为没有 break,所以一路“贯穿”到了 case 3,直到遇到 break 才退出 switch。
switch 与 if-else if-else 的比较
| 特性 | switch 语句 |
if-else if-else 语句 |
|---|---|---|
| 判断条件 | 只能判断整型(int, char, enum) |
可以判断任何类型(整数、浮点数、字符、字符串等) |
| 判断形式 | 精确匹配() | 可以使用任何比较运算符(, , >, <, >=, <=) |
| 代码可读性 | 当有多个离散值分支时,代码结构更清晰、更易读 | 当分支逻辑复杂或条件范围判断时,更灵活、更直观 |
| 实现效率 | 在某些情况下,编译器可以生成更高效的跳转表代码 | 效率通常略低于 switch,因为它是逐个条件判断的 |
何时使用?
-
优先使用
switch:当你需要根据一个变量的多个离散整数值来执行不同的操作时,- 处理菜单选项 (
1,2,..) - 处理星期几 (
1-7) - 处理状态码 (
0=成功,1=失败,2=进行中)
- 处理菜单选项 (
-
使用
if-else if-else:当你的判断条件更复杂时,- 判断一个范围(
if (x > 10 && x < 20)) - 判断浮点数(
if (price > 99.99)) - 判断字符串(
if (strcmp(name, "admin") == 0)) - 只有少数几个分支,或者逻辑非常简单。
- 判断一个范围(
switch 是 C 语言中一个非常重要且强大的控制流工具,掌握它的关键点在于:
- 理解其工作原理:通过匹配表达式的值来跳转到相应的
case。 - 牢记
break的重要性:在大多数情况下,每个case末尾都需要break来防止不必要的“贯穿”。 - 知道何时使用它:在处理多个离散整数值分支时,
switch是比if-else if-else更优雅、更高效的选择。
