switch-case 是一种多路分支语句,它可以根据一个变量的值,从多个代码块中选择一个来执行,它通常可以替代复杂的 if-else if-else 结构,使代码更清晰、更易读。

(图片来源网络,侵删)
基本语法
switch 语句的基本结构如下:
switch (expression) {
case constant_expression1:
// 当 expression 的值等于 constant_expression1 时,执行这里的代码
break; // 可选,但强烈推荐
case constant_expression2:
// 当 expression 的值等于 constant_expression2 时,执行这里的代码
break; // 可选,但强烈推荐
case constant_expression3:
// 当 expression 的值等于 constant_expression3 时,执行这里的代码
break; // 可选,但强烈推荐
default:
// expression 的值不匹配任何一个 case,执行这里的代码
break; // 可选,但强烈推荐
}
语法规则详解
-
switch表达式- 圆括号中的
expression必须是一个整型表达式,这意味着它可以是一个int,char,short,long等整型类型的变量或常量。不能是float,double或string。
- 圆括号中的
-
case- 每个
case后面跟一个常量表达式(constant_expression),这个值必须是编译时就能确定的常量,不能是变量。 case标签的值必须是唯一的,不能有两个case标签使用相同的常量值。case标签本身只是一个入口点,它不包含任何执行逻辑,当switch表达式的值与某个case的常量匹配时,程序就会跳转到那个case标签所在的位置开始执行,然后继续向下执行,除非遇到break语句。
- 每个
-
break语句
(图片来源网络,侵删)break语句的作用是跳出switch语句,当执行到break时,程序会立即终止switch的执行,然后跳转到switch语句后面的第一条语句继续执行。break是可选的,但如果不使用它,就会发生“case 穿透”(case falling through)现象。
-
defaultdefault是一个可选的分支。switch表达式的值与任何一个case标签都不匹配,程序就会跳转到default标签处执行。default可以放在switch语句的任何位置(开头、中间或结尾),但通常习惯放在最后。default后面也可以使用break,尤其是在它不在末尾时,或者为了代码风格统一。
核心概念:Case 穿透
这是理解 switch 语句最关键的一点,如果没有 break 语句,程序在匹配到一个 case 后,会继续执行下一个 case 的代码,直到遇到 break 或 switch 语句的末尾。
示例:不使用 break(Case 穿透)
#include <stdio.h>
int main() {
int grade = 'B'; // ASCII码中 'B' 对应 66
switch (grade) {
case 'A':
printf("Excellent!\n");
break; // 如果匹配 'A',执行完这句就退出switch
case 'B':
printf("Good job!\n");
// 没有 break,所以会继续向下执行
case 'C':
printf("Average.\n");
// 没有 break,所以会继续向下执行
case 'D':
printf("You need to work harder.\n");
break; // 遇到 break,退出 switch
default:
printf("Invalid grade.\n");
break;
}
return 0;
}
输出结果:
Good job!
Average.
You need to work harder.
过程分析:

(图片来源网络,侵删)
grade的值是'B'(即 66)。switch开始匹配,发现'B'匹配第二个case。- 程序跳转到
case 'B':,打印Good job!。 - 因为这里没有
break,程序不会退出switch,而是继续向下执行case 'C':的代码。 - 打印
Average.。 - 同样,没有
break,继续向下执行case 'D':的代码。 - 打印
You need to work harder.。 - 遇到
break,switch语句执行结束。
示例:使用 break(标准用法)
#include <stdio.h>
int main() {
int grade = 'B';
switch (grade) {
case 'A':
printf("Excellent!\n");
break;
case 'B':
printf("Good job!\n");
break; // 添加 break,执行完就退出
case 'C':
printf("Average.\n");
break;
case 'D':
printf("You need to work harder.\n");
break;
default:
printf("Invalid grade.\n");
break;
}
return 0;
}
输出结果:
Good job!
这次,程序在执行完 case 'B' 的代码后,立即遇到了 break,switch 语句就结束了。
switch vs. if-else if-else
什么时候用 switch,什么时候用 if-else?
| 特性 | switch-case |
if-else if-else |
|---|---|---|
| 判断条件 | 只能判断整型或字符型常量。 | 可以判断任何类型的表达式(整数、浮点数、字符串、逻辑运算等)。 |
| 可读性 | 当判断条件是多个离散的、固定的值时,switch 结构更清晰。 |
当判断条件范围复杂、逻辑关系多样时,if-else 更灵活。 |
| 实现原理 | 通常使用跳转表实现,效率可能更高。 | 使用一系列的条件判断,效率取决于条件的顺序。 |
case 穿透 |
是其固有特性,可以有意利用。 | 没有“穿透”的概念,每个 else if 都是独立的。 |
经验法则:
- 如果你要判断一个变量是否等于几个固定的、离散的值(
1, 2, 3或'A', 'B', 'C'),优先使用switch。 - 如果你要判断的是一个范围(
x > 10 && x < 20)或者复杂的逻辑组合,必须使用if-else。
综合示例
示例:根据输入的数字输出对应的星期几
#include <stdio.h>
int main() {
int day;
printf("请输入一个数字 (1-7): ");
scanf("%d", &day);
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("输入无效,请输入 1 到 7 之间的数字,\n");
break;
}
return 0;
}
高级用法:有意的 Case 穿透
case 穿透特性是有用的,在评分系统中,A+、A、A- 都可以算作 "A" 等级。
#include <stdio.h>
int main() {
char score = 'A';
switch (score) {
case 'A':
case 'a':
printf("等级: A (优秀)\n");
break;
case 'B':
case 'b':
printf("等级: B (良好)\n");
break;
case 'C':
case 'c':
printf("等级: C (及格)\n");
break;
default:
printf("等级: F (不及格)\n");
break;
}
return 0;
}
输出结果:
等级: A (优秀)
在这个例子中,无论 score 是 'A' 还是 'a',程序都会跳转到 case 'A': 的位置,然后因为没有 break,继续向下执行 case 'a': 的代码,直到遇到 printf 和 break,这样就实现了多个 case 执行同一段代码的目的。
switch是一个多路分支结构,用于处理离散的、固定的值。switch的表达式必须是整型。break语句至关重要,用于终止switch的执行,忘记break是最常见的初学者错误。default分支提供了处理所有未匹配情况的“安全网”。case穿透既是陷阱,也可以被巧妙地利用。
掌握 switch-case 语句能让你的 C 语言代码在面对多条件选择时,变得更加简洁和优雅。
