default 是 switch 语句中的一个可选部分,但它非常重要,是编写健壮代码的关键。

default 的核心作用
default 的作用类似于 if-else 语句中的 else,当 switch 表达式的值不匹配任何一个 case 标签的值时,程序就会执行 default 后面的代码块。
可以把它理解为:“以上所有情况都不是,那就执行这个默认情况”。
语法结构
default 必须放在 switch 代码块的末尾(虽然技术上可以放在任何位置,但放在末尾是标准且最佳实践)。
switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时执行的代码
break;
case constant2:
// 当 expression 的值等于 constant2 时执行的代码
break;
// ... 可以有更多的 case ...
default:
// 当 expression 的值不等于任何一个 case 常量时执行的代码
break; // 虽然 default 后的 break 不是必须的,但加上是好习惯
}
代码示例
让我们通过几个例子来理解 default 的用法。

示例 1:基本用法
#include <stdio.h>
int main() {
int day = 5; // 假设 5 代表星期五
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;
}
分析:
day的值是5,它会匹配case 5:,所以会打印 "星期五"。- 如果我们把
int day = 5;改成int day = 8;,day的值不会匹配任何一个case,程序就会跳转到default分支,打印 "输入无效,请输入 1-7 之间的数字。"。
示例 2:default 的位置(最佳实践)
虽然 C 语言允许 default 出现在任何位置,但强烈建议总是将它放在 switch 语句的最后。
为什么?
- 代码清晰:它明确地表示了“所有其他情况”,逻辑上放在最后最符合阅读习惯。
- 防止逻辑错误:
default不在最后,并且忘记在它后面加break,可能会导致意外的 "fall-through"(贯穿)行为。
错误示范(不推荐):

#include <stdio.h>
int main() {
int grade = 'B';
switch (grade) {
default:
printf("无效的等级\n");
break; // 必须有 break,否则会继续执行 case 'A'
case 'A':
printf("优秀\n");
break;
case 'B':
printf("良好\n");
break;
case 'C':
printf("及格\n");
break;
}
return 0;
}
如果等级是 'B',它会打印 "良好",break,但如果等级是 'D',它会先打印 "无效的等级",然后因为没有 break(假设忘了加),它会继续执行 case 'A:',打印 "优秀",这显然不是我们想要的结果。
正确做法(将 default 放在最后):
#include <stdio.h>
int main() {
int grade = 'B';
switch (grade) {
case 'A':
printf("优秀\n");
break;
case 'B':
printf("良好\n");
break;
case 'C':
printf("及格\n");
break;
default: // 放在最后,逻辑清晰
printf("无效的等级\n");
break;
}
return 0;
}
这个版本无论 grade 是什么,逻辑都非常清晰,不会出现意外的贯穿。
示例 3:default 后的 break 是必须的吗?
答案是:不必须,但强烈建议加上。
-
当
default是最后一个分支时:即使没有break,执行完default的代码后,程序也会自然地跳出switch语句,因为后面没有其他代码了。switch (x) { case 1: printf("One"); break; default: printf("Other"); // 没有 break,但没关系 } // 执行完 default 后,程序会继续执行 switch 之后的代码 -
当
default不是最后一个分支时:default后面没有break,程序会继续执行下一个case的代码,这通常是一个 bug。
最佳实践:无论 default 在哪里,都养成加上 break 的好习惯,这可以确保代码的健壮性,并且在 default 分支位置发生变化时(比如需要添加新的 case),不会引入新的错误。
default 的重要性总结
- 增强代码的健壮性:处理了所有预期的输入之外的情况,防止程序在遇到意外输入时产生不可预测的行为或崩溃。
- 提供清晰的逻辑:它明确指出了“所有其他情况”,使代码的逻辑更加完整和易于理解。
- 便于调试和维护:当出现无效输入时,
default分支可以打印出错误信息或执行一个安全的默认操作,帮助开发者快速定位问题。
与 if-else if-else 的对比
switch 语句通常可以用 if-else if-else 结构来替代。
// switch 版本
switch (day) {
case 1: printf("Mon"); break;
case 2: printf("Tue"); break;
// ...
default: printf("Invalid"); break;
}
// if-else if-else 版本
if (day == 1) {
printf("Mon");
} else if (day == 2) {
printf("Tue");
}
// ...
else {
printf("Invalid");
}
default对应else:default分支的作用与if-else结构中的else分支完全相同。- 选择哪个?
- 当需要检查一个变量等于几个离散值中的一个时,
switch通常更清晰、更高效。 - 当需要检查的范围是连续的(如
x > 10 && x < 20),或者条件非常复杂时,if-else if-else更灵活。
- 当需要检查一个变量等于几个离散值中的一个时,
希望这个详细的解释能帮助你完全理解 C 语言中 switch 的 default 用法!
