default 是 switch 语句中的一个可选但非常重要的部分,它定义了当 switch 表达式的值与任何一个 case 标签的值都不匹配时,程序应该执行的代码块。

default 的核心作用
default 的作用类似于 if-else if 结构中的最后的 else。
-
if-else if结构:if (条件1) { // ... } else if (条件2) { // ... } else { // 当以上所有条件都不为真时,执行这里的代码 } -
switch结构:switch (表达式) { case 值1: // ... break; case 值2: // ... break; default: // 等价于上面的 else // 当表达式的值不等于 值1, 值2... 时,执行这里的代码 break; }
default 提供了一个“兜底”方案,处理所有未被 case 明确覆盖的情况。

default 的语法和位置
- 关键字:
default。 - 它后面必须跟一个冒号 。
- 代码块:冒号后面可以跟一个或多个语句,形成一个代码块,这个代码块以
break;以防止“贯穿”(fall-through)到下一个case。 - 位置:
default可以放在switch语句中的任何位置,但通常为了代码清晰和可读性,我们习惯将它放在所有case分支的最后。
示例:
#include <stdio.h>
int main() {
int grade = 85;
switch (grade) {
case 90:
printf("优秀\n");
break;
case 80:
printf("良好\n");
break;
case 60:
printf("及格\n");
break;
default: // 放在最后,处理 60 分以下的所有情况
printf("不及格\n");
break;
}
return 0;
}
// 输出: 良好
default 的执行时机
default 分支仅在以下情况下被执行:
switch表达式的计算结果与switch语句中任何一个case的值都不相等。
重要提示:default 分支被省略,并且表达式的值与所有 case 都不匹配,switch 语句将不执行任何操作,程序会继续执行 switch 语句后面的代码。
示例(省略 default):

#include <stdio.h>
int main() {
int number = 5;
switch (number) {
case 1:
printf("数字是 1\n");
break;
case 2:
printf("数字是 2\n");
break;
// 没有 default 分支
}
printf("switch 语句执行完毕,\n"); // 这行代码总会被执行
return 0;
}
// 输出:
// switch 语句执行完毕。
在上面的例子中,number 的值是 5,没有匹配的 case,也没有 default,switch 内部没有任何输出,程序直接跳到 printf("switch 语句执行完毕,\n");。
default 的最佳实践和注意事项
a. 始终考虑使用 default
这是一个非常好的编程习惯,即使你认为当前所有可能的情况都已经被 case 覆盖,也应该加上一个 default 分支,这样做的好处是:
- 代码健壮性:当程序逻辑发生变化,或者输入数据超出预期范围时,
default可以防止程序出现未定义行为或静默失败,你可以在default中打印一条警告信息或执行一个安全的默认操作。 - 代码可读性:它向其他阅读代码的人明确表示:“我已经考虑了所有可能性,这个
default是为了处理那些意料之外的情况。”
推荐写法:
// 好的实践
switch (option) {
case 'A':
// ...
break;
case 'B':
// ...
break;
default:
printf("警告:收到未知选项 '%c'\n", option);
break;
}
b. default 和 “贯穿”(Fall-through)
default 和 case 一样,如果后面没有 break; 语句,程序会继续执行下一个分支的代码,这被称为“贯穿”。
示例(default 贯穿):
#include <stdio.h>
int main() {
int value = 3;
switch (value) {
case 1:
printf("Case 1\n");
break;
case 2:
printf("Case 2\n");
break;
case 3:
printf("Case 3\n");
// 没有 break
default: // 当 value 是 3 时,会执行到这里
printf("Default (因为 Case 3 没有break)\n");
break;
}
return 0;
}
// 输出:
// Case 3
// Default (因为 Case 3 没有break)
在这个例子中,当 value 是 3 时,程序会进入 case 3,打印 "Case 3",因为没有 break,所以它会继续向下执行 default 分支。
c. default 可以没有 break
default 是 switch 语句的最后一个分支,那么它的 break; 语句实际上是可选的,因为即使没有它,程序执行完 default 的代码后也会自动退出 switch 语句。
为了保持代码风格的一致性和清晰性,强烈建议在 default 后面也加上 break;,这可以避免在后续添加新的 case 分支时,因为忘记加 break 而导致意外的“贯穿”错误。
示例(default 没有 break,但位于末尾):
switch (x) {
case 10:
// ...
break;
default: // 位于最后,break 可以省略,但不推荐
printf("处理其他情况\n");
// break; // 省略这里也可以,但加上更安全
}
| 特性 | 描述 |
|---|---|
| 作用 | switch 的“兜底”分支,处理所有 case 未匹配的情况。 |
| 语法 | default: 后跟代码块。 |
| 位置 | 可以放在 switch 内的任何位置,但通常放在最后。 |
| 执行条件 | 仅当 switch 表达式的值与所有 case 都不匹配时执行。 |
与 break 的关系 |
和 case 一样,如果没有 break,会发生“贯穿”。 |
| 最佳实践 | 强烈建议始终包含 default 分支,即使它只打印一条警告信息,以提高代码的健壮性和可读性,为了保持一致性,建议在 default 后也加上 break;。 |
掌握 default 的正确使用,是写出清晰、健壮、可维护的 C 代码的重要一环。
