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 语句的执行流程
- 计算表达式:程序首先计算
switch后面的expression的值。 - 匹配 Case:程序将这个计算结果与每个
case后面的constant(常量)进行比较。 - 执行代码:
- 如果找到了一个匹配的
case,程序就会从该case的标签开始执行其下面的代码。 - 如果没有找到任何匹配的
case,程序就会跳转到default标签(如果存在)并执行其下面的代码。
- 如果找到了一个匹配的
break的关键作用:当代码执行到break语句时,程序会立即跳出整个switch语句,继续执行switch代码块后面的下一条语句。
⚠️ 极其重要的注意事项:
break如果你在某个
case中没有写break,程序会“掉下去”,继续执行下一个case的代码,直到遇到一个break语句或者switch语句的结束大括号 ,这种现象被称为 "fall-through"(贯穿),这通常是一个错误,但在某些特定场景下也可以被利用。
代码示例
示例 1:基本用法(带 break)
这是最常见、最标准的用法。

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int day = 3;
switch (day) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
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;
}
输出:
星期三
执行过程:
day的值是3。switch开始匹配,发现case 3:匹配成功。- 程序执行
printf("星期三\n");。 - 接着遇到
break;,程序立即跳出switch结构,main函数结束。
示例 2:fall-through(贯穿)现象
这个例子展示了如果没有 break 会发生什么。
#include <stdio.h>
int main() {
int grade = 'B'; // 字符 'B' 的 ASCII 码是 66
switch (grade) {
case 'A':
printf("优秀!\n");
break;
case 'B':
printf("良好!\n");
// 这里没有 break!
case 'C':
printf("及格.\n");
break;
case 'D':
printf("不及格.\n");
break;
default:
printf("无效的成绩.\n");
break;
}
return 0;
}
输出:

(图片来源网络,侵删)
良好!
及格.
执行过程:
grade的值是'B'(66)。switch匹配到case 'B':。- 程序执行
printf("良好!\n");。 - 由于后面没有
break,程序没有跳出,而是继续执行下一个case的代码。 - 程序执行
printf("及格.\n");。 - 遇到
break,程序才跳出switch。
示例 3:default 的位置
default 标签可以放在 switch 结构的任何位置,但通常习惯放在最后,它的作用是处理所有未被 case 捕获的情况。
#include <stdio.h>
int main() {
int number = 99;
switch (number) {
default: // 即使放在最前面,也只在所有 case 都不匹配时才执行
printf("数字不在 1 到 5 的范围内\n");
break;
case 1:
printf("数字是 1\n");
break;
case 2:
printf("数字是 2\n");
break;
case 3:
case 4: // 多个 case 共享同一块代码
case 5:
printf("数字是 3, 4 或 5\n");
break;
}
return 0;
}
输出:
数字不在 1 到 5 的范围内
switch vs if-else if-else
| 特性 | switch 语句 |
if-else if-else 语句 |
|---|---|---|
| 判断条件 | 只能判断离散的、确定的常量值。 | 可以判断任何表达式,包括范围、关系、逻辑等。 |
| 数据类型 | 通常是 int 或 char 类型,在 C99 及以后,也可以是 long 等。 |
任何数据类型都可以。 |
| 执行效率 | 在某些情况下,编译器可以生成更高效的跳转表,执行速度可能更快。 | 对于复杂的条件链,效率可能稍低,但现代编译器优化得很好。 |
| 代码可读性 | 当需要检查同一个变量与多个常量是否相等时,switch 结构更清晰、更易读。 |
当逻辑比较复杂(如 if (x > 10 && x < 20))时,if-else 更自然。 |
选择建议:
- 如果你的逻辑是检查一个变量是否等于
A、B、C... 等几个固定值,优先使用switch。 - 如果你的逻辑涉及范围判断(如
x > 100)、复杂的布尔逻辑(如a && b)或不同类型的判断,使用if-else if-else。
重要规则和限制
expression的类型:switch后的表达式必须是整型(int,char,short,long等),不能是float,double或字符串。case的常量:每个case后面的值必须是常量或常量表达式,不能是变量。case x:是错误的,但case 10+20:是正确的。case唯一性:在一个switch结构中,case后面的常量值必须是唯一的,不能重复,两个case 1:是不允许的。default可选:default标签是可选的,可以省略,如果省略,并且没有case匹配,switch语句将什么都不做。
switch 是 C 语言中一个强大而简洁的控制流工具,特别适用于处理基于单一变量值的多种情况,理解并牢记 break 语句的作用是掌握 switch 的关键,它能让你的代码在特定场景下比冗长的 if-else if-else 链更清晰、更高效。
