核心要点
在 C 语言中,switch 语句本身没有直接的 else 关键字。switch 语句使用 case 和 default 来处理不同的分支,而 default 在功能上类似于 if-else 结构中的 else。

(图片来源网络,侵删)
switch 语句的基本结构
switch 语句是一个多路分支控制结构,它根据一个表达式的值,来执行多个代码块中的一个。
switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时,执行这里的代码
break;
case constant2:
// 当 expression 的值等于 constant2 时,执行这里的代码
break;
case constant3:
// 当 expression 的值等于 constant3 时,执行这里的代码
break;
default:
// 当 expression 的值不等于任何一个 case 时,执行这里的代码
break; // default 的 break 是可选的,但推荐加上
}
关键规则:
switch表达式: 里的表达式必须是整型(int,char,long等)或枚举类型。case常量:每个case后面必须跟一个常量表达式(不能是变量),并且所有case的值必须是唯一的。break语句:这是switch中最关键也最容易出错的部分。break的作用是跳出整个switch语句,如果某个case后面没有break,程序会继续执行下一个case的代码,这被称为 "case 穿透" (fall-through)。default分支:default是可选的。switch表达式的值与所有case都不匹配,程序就会执行default分支的代码,它的作用就相当于if-else里的else。
default:switch 的 "else"
default 分支是 switch 语句的“默认”或“其他情况”处理分支,它在功能上完全等同于 if-else if-else 结构中的 else。
if-else 版本:
if (grade == 'A') {
printf("优秀\n");
} else if (grade == 'B') {
printf("良好\n");
} else if (grade == 'C') {
printf("及格\n");
} else { // 这里的 else 就相当于 switch 里的 default
printf("不及格\n");
}
switch 版本:

(图片来源网络,侵删)
switch (grade) {
case 'A':
printf("优秀\n");
break;
case 'B':
printf("良好\n");
break;
case 'C':
printf("及格\n");
break;
default: // 这里的 default 就相当于 if-else 里的 else
printf("不及格\n");
break;
}
"Case 穿透" (Fall-through) 及其应用
这是 switch 一个非常独特的特性,当你省略 break 时,代码会“穿透”到下一个 case。
示例 1:意外的穿透(常见错误)
假设我们想根据分数段给出评语,但忘记写 break。
int score = 85;
switch (score / 10) { // score / 10 得到 8
case 10:
case 9:
printf("优秀\n"); // 执行
case 8:
printf("良好\n"); // 因为上面没有 break,所以也执行了
case 7:
printf("中等\n"); // 同样也执行了
default:
printf("及格\n"); // 最后也执行了
break;
}
// 输出结果:
// 优秀
// 良好
// 中等
// 及格
这显然不是我们想要的结果,忘记 break 是一个非常常见的错误。
示例 2:利用穿透(巧妙用法) 我们可以故意利用穿透来简化代码,给 90 分以上和 80-89 分都算“优秀”。
int score = 95;
switch (score / 10) {
case 10:
case 9:
printf("优秀\n"); // 当 score/10 是 10 或 9 时,都会执行到这里
break;
case 8:
printf("良好\n");
break;
default:
printf("及格\n");
break;
}
// 输出结果:
// 优秀
在这个例子中,case 10: 和 case 9: 共享了同一段代码,非常优雅。
switch vs. if-else if-else
| 特性 | switch 语句 |
if-else if-else 语句 |
|---|---|---|
| 判断条件 | 只能判断离散值(常量) | 可以判断任何条件(范围、表达式、变量等) |
| 数据类型 | 通常是整型或枚举类型 | 任何数据类型(整数、浮点数、字符、指针等) |
| 可读性 | 当有多个离散值的分支时,代码更清晰、结构化 | 当条件复杂或涉及范围判断时,更灵活、更清晰 |
| "else" | 使用 default |
使用 else |
选择建议:
- 当你需要根据一个变量的具体值(
int,char)来执行不同的操作时,优先使用switch,它通常比一长串的if-else if更易读。 - 当你需要判断范围(如
if (x > 10 && x < 20))或复杂的逻辑表达式时,必须使用if-else if-else。
switch没有else:C 语言的switch语句使用default来处理所有未被case匹配的情况。default的作用:default分支在功能上等同于if-else结构中的else,是“其他所有情况”的默认处理分支。break至关重要:记得在每个case代码块的末尾加上break,除非你确实需要“case 穿透”的特性。switch与if-else的选择:根据判断条件的性质(离散值 vs. 范围/复杂逻辑)来选择更合适的结构。
