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 (expression)expression是一个整型表达式(包括int,char,short,long等,因为char在本质上是整型)。- 它不能是浮点型(如
float,double)或其他复杂数据类型。 - 这个表达式的值会与下面每个
case后面的constant进行比较。
-
case constant:constant必须是一个常量或常量表达式(不能是变量)。- 每个
case后面的值必须是唯一的,不能有重复。 - 当
switch的expression值与某个case的constant匹配时,程序会从该case的位置开始执行。 - 注意:
case后面跟的是 (冒号),而不是 (分号)。
-
break;语句
(图片来源网络,侵删)break是switch语句中至关重要的部分。- 它的作用是立即跳出整个
switch语句,防止程序“掉落”(fall-through)到下一个case中执行。 - 如果省略了
break,程序会继续执行下一个case的代码,直到遇到一个break或switch语句的结束大括号 。
-
default:default是一个可选的部分,类似于if-else结构中的else。expression的值与所有case都不匹配,程序就会执行default后面的代码。default可以放在switch语句的任何位置,但通常放在最后,这样逻辑更清晰,它也可以不加break,因为它是最后一个分支。
break 语句与“掉落”(Fall-through)现象
这是 switch 语句最容易出错也最需要理解的地方。
示例:省略 break 的情况
#include <stdio.h>
int main() {
int grade = 'B'; // 使用字符,因为字符是整型
switch (grade) {
case 'A':
printf("优秀!\n");
break; // 如果匹配到 'A',执行完这句就退出 switch
case 'B':
printf("良好!\n");
// 这里没有 break,所以程序会继续执行下一个 case
case 'C':
printf("及格!\n");
// 这里也没有 break
case 'D':
printf("不及格!\n");
break; // 遇到 break,才退出 switch
default:
printf("无效的成绩!\n");
break;
}
return 0;
}
输出结果:

(图片来源网络,侵删)
良好!
及格!
不及格!
分析:
当 grade 的值是 'B' 时,程序进入 case 'B',打印 "良好!",因为没有 break,程序不会退出 switch,而是继续向下执行 case 'C' 和 case 'D' 的代码,直到遇到 case 'D' 中的 break 才停止。
switch 与 if-else if-else 的选择
什么时候用 switch,什么时候用 if-else if-else?
| 特性 | switch 语句 |
if-else if-else 语句 |
|---|---|---|
| 判断条件 | 只能判断整型(或字符)的单一值。 | 可以判断任何类型的表达式,包括范围(如 x > 10)、关系(如 x == y)和逻辑(如 x && y)。 |
| 可读性 | 当需要判断一个变量与多个离散值是否相等时,switch 结构更清晰。 |
当判断逻辑复杂(涉及范围、布尔条件等)时,if-else 更自然。 |
| 执行效率 | 对于多路分支,switch 通常比一连串的 if-else if 更高效,因为它可能使用“跳转表”(jump table)实现。 |
效率取决于条件的复杂性和数量。 |
| “掉落”特性 | 有独特的“掉落”特性,有时可以利用(见下文),但初学者容易出错。 | 没有“掉落”特性,每个 else if 是独立的。 |
- 用
switch:当你明确需要检查一个变量是否等于A、B、C、D... 这样的具体值时。 - 用
if-else if-else:当你需要检查范围(score > 90)、组合条件(age > 18 && gender == 'M')或者数据类型不是整型时。
switch 语句的进阶用法
1 利用“掉落”特性
虽然“掉落”通常是bug的来源,但在某些特定场景下,它可以被巧妙地利用。
示例:判断元音字母
#include <stdio.h>
int main() {
char ch = 'e';
switch (ch) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf("%c 是一个元音字母,\n", ch);
break;
default:
printf("%c 是一个辅音字母,\n", ch);
break;
}
return 0;
}
分析:
ch 是 'e',程序会进入 case 'e',但由于没有 break,它会继续向下“掉落”,执行 printf 语句。ch 是 'a',它会直接“掉落”到 printf 语句,这样,一个 printf 就处理了所有元音字母的情况,代码更简洁。
2 在 case 中使用变量(C99 及以后)
在 C99 标准及之后,case 标签可以使用变量,但该变量必须是 const 或字面量,因为 case 的值必须在编译时确定。
const int A = 1;
const int B = 2;
int main() {
int x = 2;
switch (x) {
case A: // 合法
printf("A\n");
break;
case B: // 合法
printf("B\n");
break;
// case x: // 非法!x 是变量,编译时会报错
// printf("x\n");
// break;
}
return 0;
}
完整示例
示例:一个简单的计算器
#include <stdio.h>
int main() {
char operator;
double num1, num2;
printf("请输入一个运算符 (+, -, *, /): ");
scanf("%c", &operator);
printf("请输入两个数字: ");
scanf("%lf %lf", &num1, &num2);
switch (operator) {
case '+':
printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);
break;
case '-':
printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);
break;
case '*':
printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);
break;
case '/':
// 处理除数为零的情况
if (num2 != 0) {
printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);
} else {
printf("错误:除数不能为零,\n");
}
break;
default:
printf("错误:无效的运算符,\n");
break;
}
return 0;
}
switch 语句是 C 语言中一个强大且常用的控制流工具,理解其核心要点至关重要:
- 只用于整型:表达式必须是整型。
case是常量:case后的值必须是唯一的常量。break是关键:记得在每个case的末尾使用break,除非你故意利用“掉落”特性。default是兜底:处理所有未匹配的情况,提高代码的健壮性。- 合理选择:根据判断条件的类型(单一值 vs. 范围/复杂条件)来决定使用
switch还是if-else。
