一句话概括
switch 语句是一个多路分支结构,它可以根据一个变量的值,从多个代码块中选择一个来执行,你可以把它想象成一个多向开关或者自动取款机的菜单选择。

(图片来源网络,侵删)
核心思想与作用
想象一下,你需要根据一个学生的分数('A', 'B', 'C', 'D')来输出不同的评价,用 if-else if 语句会是这样:
if (grade == 'A') {
printf("优秀!");
} else if (grade == 'B') {
printf("良好。");
} else if (grade == 'C') {
printf("及格。");
} else if (grade == 'D') {
printf("不及格。");
} else {
printf("无效的成绩。");
}
如果判断条件非常多,if-else if 链条会变得很长,可读性下降。
这时,switch 语句就派上用场了,它能让代码结构更清晰,更直观地表达“根据某个值,执行不同操作”的逻辑。
switch 语句的语法结构
一个完整的 switch 语句由以下几个部分组成:
switch (表达式) {
case 常量1:
// 当表达式的值等于 常量1 时,执行这里的代码
break; // 跳出 switch
case 常量2:
// 当表达式的值等于 常量2 时,执行这里的代码
break; // 跳出 switch
case 常量3:
// 当表达式的值等于 常量3 时,执行这里的代码
break; // 跳出 switch
default:
// 如果表达式的值不匹配任何一个 case,执行这里的代码
break; // 虽然在 default 后 break 不是必须的,但加上是好习惯
}
各部分详解:
-
switch (表达式)- 这是开关的“控制中心”。
表达式的结果必须是整型(int,char,long等),或者可以被转换为整型的类型(enum枚举)。*浮点数(如float,double)或字符串(`char`)是不允许的**。- 这个表达式的值会与下面
case标签中的常量进行比较。
-
case 常量:- 这是开关的“各个档位”。
常量必须是一个整型常量(10, 'A',3),不能是变量。switch会找到第一个与表达式值相匹配的case,然后开始执行该case后面的代码。
-
break;- 这是极其重要的部分!
break的作用是立即跳出整个switch语句。- 如果没有
break,程序会执行完匹配的case后,继续执行下一个case的代码,直到遇到break或switch结束,这种现象被称为“贯穿”(fall-through),虽然有时可以利用它,但初学者最好总是加上break,除非你明确知道要利用贯穿特性。
-
default:- 这是“默认档位”或“其他档位”。
switch的表达式的值没有匹配任何一个case,那么程序就会执行default后面的代码。default是可选的,但强烈推荐使用,它可以处理所有未预料到的情况,就像if-else里的else一样。
举个例子
我们用 switch 来重写学生成绩评价的例子:
#include <stdio.h>
int main() {
char grade = 'B'; // 假设学生成绩是 B
switch (grade) {
case 'A':
printf("优秀!\n");
break; // 匹配到 A 后,执行完打印,然后跳出 switch
case 'B':
printf("良好,\n");
break; // 匹配到 B 后,执行完打印,然后跳出 switch
case 'C':
printf("及格,\n");
break;
case 'D':
printf("不及格,\n");
break;
default: // 如果成绩不是 A, B, C, D 中的任何一个
printf("无效的成绩,\n");
break;
}
return 0;
}
执行流程:
grade的值是'B'。switch开始检查,case 'A'?不匹配。- 继续检查,
case 'B'?匹配! - 程序进入
case 'B'的代码块,执行printf("良好,\n");。 - 遇到
break;,立即跳出switch语句。 - 程序继续执行
switch之后的代码(return 0;)。
一个重要的特性:贯穿 (Fall-through)
如果去掉 break,会发生什么?
#include <stdio.h>
int main() {
int number = 2;
switch (number) {
case 1:
printf("数字是 1\n");
// 没有 break!
case 2:
printf("数字是 2\n");
// 没有 break!
case 3:
printf("数字是 3\n");
break;
default:
printf("数字不在 1-3 范围内\n");
}
return 0;
}
执行结果:
数字是 2
数字是 3
执行流程:
number是2。switch匹配到case 2。- 开始执行
printf("数字是 2\n");。 - 没有遇到
break,所以程序继续往下执行,进入case 3的代码块。 - 执行
printf("数字是 3\n");。 - 遇到
break,跳出switch。
虽然贯穿特性有时可以简化代码(多个 case 执行相同的操作),但它也是一个常见的错误来源,一个黄金法则是:除非你有明确的理由,否则在每个 case 的末尾都加上 break。
switch vs if-else if
| 特性 | switch |
if-else if |
|---|---|---|
| 判断条件 | 只能判断一个整型表达式的多个固定值 | 可以判断任意复杂的条件(范围、逻辑、浮点数等) |
| 可读性 | 当判断多个离散值时,结构更清晰,可读性更高 | 当判断条件复杂或较少时,更直观 |
| 灵活性 | 较低 | 非常高 |
| 执行效率 | 在某些情况下,编译器可以生成更高效的跳转表代码 | 效率通常也很好,但 switch 在多分支时可能更有优势 |
- 当你需要根据一个变量的具体值(如菜单选项、状态码、字母等级)来执行不同操作时,优先使用
switch。 - 当你需要判断范围(如
if (x > 10 && x < 20))、复合条件(如if (a || b && c))或者浮点数时,必须使用if-else。
希望这个解释能帮助你完全理解 C 语言中的 switch 语句!
