switch 语句是一种多路分支控制结构,它允许一个变量或表达式与一系列值(即你的 selitems)进行比较,并执行与匹配值相对应的代码块,这通常比使用多个 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):expression是一个整型、字符型或枚举类型的表达式,它的值将和每个case后面的常量进行比较。case constant::constant必须是一个常量或常量表达式(不能是变量),它的类型必须和switch的expression兼容,当expression的值与constant匹配时,程序就会从该case标签开始执行。break;: 这是非常重要的一部分!break语句用于“跳出”switch语句,如果没有break,程序会继续执行下一个case的代码,这被称为 “贯穿” (fall-through),在某些情况下(如多个case执行相同代码)可以利用它,但大多数情况下都需要break来防止意外的贯穿。default:: 这是一个可选的“默认”分支。expression的值不匹配任何一个case,程序就会执行default后面的代码。default的位置是灵活的,但通常放在最后。
完整示例:处理用户菜单选择
假设我们有一个简单的菜单程序,用户输入一个数字(1-4),程序根据这个数字执行不同的操作,这里的 selitems 就是用户输入的数字 1, 2, 3, 4。
#include <stdio.h>
int main() {
int choice; // 用户的选择,这就是我们的 "selitem"
printf("请选择一个操作:\n");
printf("1. 加法\n");
printf("2. 减法\n");
printf("3. 乘法\n");
printf("4. 除法\n");
printf("请输入你的选择 (1-4): ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("你选择了加法,\n");
// 这里可以调用加法函数
break;
case 2:
printf("你选择了减法,\n");
// 这里可以调用减法函数
break;
case 3:
printf("你选择了乘法,\n");
// 这里可以调用乘法函数
break;
case 4:
printf("你选择了除法,\n");
// 这里可以调用除法函数
break;
default:
printf("无效的选择!请输入 1 到 4 之间的数字,\n");
break;
}
return 0;
}
代码解释:
- 我们定义了一个整型变量
choice,它将用来存储用户的输入,也就是我们的“选择项”。 - 我们打印一个菜单,让用户知道有哪些选项。
scanf读取用户输入并存入choice。switch (choice)开始判断choice的值。choice是1,程序就进入case 1:,打印对应信息,然后遇到break,退出switch。choice是2,程序就进入case 2:,以此类推。- 如果用户输入的不是
1,2,3,4中的任何一个(5),那么没有任何一个case匹配,程序就会执行default:分支,提示“无效的选择”。
重要概念:“贯穿” (Fall-through)
switch 语句的一个特性是,如果没有 break,代码会继续执行下一个 case。

(图片来源网络,侵删)
示例:
#include <stdio.h>
int main() {
int grade = 3; // 假设等级是 3
switch (grade) {
case 4:
printf("优秀!\n");
break;
case 3:
printf("良好!\n");
// 没有 break!
case 2:
printf("及格!\n");
break;
case 1:
printf("不及格!\n");
break;
default:
printf("无效等级!\n");
}
return 0;
}
输出结果:
良好!
及格!
原因:
当 grade 是 3 时,程序进入 case 3:,打印 "良好!",因为没有 break 语句,程序不会退出 switch,而是继续向下执行,进入了 case 2:,打印了 "及格!",然后才遇到 break 退出。
什么时候需要“贯穿”? 虽然不常见,但有时是有用的,处理多个输入字符代表同一个含义:

(图片来源网络,侵删)
char c = 'a';
switch (c) {
case 'a':
case 'A':
printf("这是字母 A,\n");
break;
case 'b':
case 'B':
printf("这是字母 B,\n");
break;
// ...
}
在这个例子中,'a' 和 'A' 都会执行相同的代码块,'b' 和 'B' 也是如此。
switch 与 if-else if 的选择
| 特性 | switch 语句 |
if-else if 语句 |
|---|---|---|
| 比较类型 | 仅限于整型、字符型、枚举型,可以比较表达式。 | 可以比较任何类型(整数、浮点数、字符串等)。 |
| 可读性 | 当对一个变量进行多个离散值的判断时,switch 结构更清晰。 |
当条件复杂或范围判断时,if-else 更直观。 |
| 效率 | 对于多路分支,switch 通常会被编译成更高效的“跳转表” (jump table),性能可能略优。 |
编译器会优化,但通常 switch 在多分支场景下更优。 |
| 灵活性 | 较低,只能进行相等性比较。 | 更高,可以进行 <, >, , 等各种比较。 |
- 如果你的逻辑是“检查一个变量是否等于值1、值2、值3...”,优先使用
switch。 - 如果你的逻辑是“如果条件A成立,否则如果条件B成立...”,或者需要比较范围(如
if (x > 10 && x < 20)),则使用if-else if。
希望这个详细的解释能帮助你完全理解 C 语言中的 switch 语句!
