default 是 C 语言中的一个关键字,它主要有两个核心用途,分别在不同的上下文中扮演不同的角色:

(图片来源网络,侵删)
- 在
switch语句中作为默认分支 - 在 C11 引入的
_Generic(泛型) 选择中作为默认情况
第一个用途是 default 最常见、最广为人知的含义。
在 switch 语句中的 default (最常见用法)
这是 default 最主要和最经典的用法,它用于 switch 语句中,作为一个“捕获所有”的分支。
核心作用
当 switch 表达式的值不匹配任何一个 case 标签的值时,程序就会执行 default 分支中的代码,你可以把它理解为 if-else if-else 结构中的那个最终的 else。
工作流程
- 程序计算
switch后面的表达式。 - 程序将这个表达式的值与每个
case后面的常量值进行比较。 - 如果找到了一个匹配的
case,程序就跳转到该case标签下开始执行代码。 - 如果没有找到任何一个匹配的
case,程序就会跳转到default标签下开始执行代码。 default分支也不存在,且没有任何case匹配,switch语句就直接结束,什么也不做。
示例代码
#include <stdio.h>
int main() {
int score = 85;
// 使用 switch 语句来评定成绩等级
switch (score / 10) { // score / 10 的结果是 8
case 10:
case 9:
printf("成绩等级: A\n");
break; // 跳出 switch 语句
case 8:
printf("成绩等级: B\n");
break;
case 7:
printf("成绩等级: C\n");
break;
case 6:
printf("成绩等级: D\n");
break;
default: // 当 score / 10 不等于 10, 9, 8, 7, 6 时执行
printf("成绩等级: F (不及格)\n");
break;
}
return 0;
}
代码解析:

(图片来源网络,侵删)
score是 85,score / 10的结果是 8。switch开始比较,发现case 8匹配。- 程序执行
printf("成绩等级: B\n");。 - 遇到
break;语句,switch执行结束。
如果我们将 score 改为 55:
score / 10的结果是 5。switch会检查case 10,case 9,case 8,case 7,case 6,发现都不匹配。- 程序会执行
default分支,打印出"成绩等级: F (不及格)\n"。
重要注意事项
default的位置:default分支可以放在switch语句中的任何位置,但通常为了代码清晰,会放在所有case分支的最后。break语句:在case和default分支中,如果没有break语句,程序会“穿透”(fall-through)到下一个分支继续执行,这有时是故意为之,但更多时候是疏忽导致的错误。int x = 2; switch (x) { case 1: printf("One\n"); break; // 如果没有 break,这里会穿透到 case 2 case 2: printf("Two\n"); break; default: printf("Other\n"); } // 输出: Two
在 C11 _Generic 选择中的 default
C11 标准引入了一个非常强大的特性叫做 _Generic,它允许你在编译时根据表达式的类型来选择不同的函数或操作,在这种情况下,default 也可以作为一个选项。
核心作用
在 _Generic 选择中,default 提供了一个“后备”选项,当表达式的类型不匹配前面列出的任何一个类型标签时,就会选择 default 对应的那个操作。
语法结构
_Generic (控制表达式,
类型标签1, 对应操作1,
类型标签2, 对应操作2,
...,
default, 默认操作
)
示例代码
假设我们想写一个函数,可以安全地打印不同类型的变量(int, double, char*),对于其他不支持的类型,我们打印一个错误信息。

(图片来源网络,侵删)
#include <stdio.h>
// 定义一个宏,使用 _Generic 来选择正确的打印方式
#define PRINT_ANY(x) _Generic((x), \
int, printf("Integer: %d\n"), \
double, printf("Double: %f\n"), \
const char*, printf("String: %s\n"), \
default, printf("Unsupported type!\n") \
)
int main() {
int a = 10;
double b = 3.14;
const char* c = "Hello, C11!";
float d = 5.5f; // float 类型,不在我们的类型列表中
PRINT_ANY(a); // 匹配 int
PRINT_ANY(b); // 匹配 double
PRINT_ANY(c); // 匹配 const char*
PRINT_ANY(d); // 不匹配任何类型,执行 default
return 0;
}
代码解析:
- 当
PRINT_ANY(a)被调用时,x是int类型,匹配第一个标签,执行printf("Integer: %d\n");。 - 当
PRINT_ANY(d)被调用时,x是float类型。float不在int,double,const char*的列表中,因此会匹配default,执行printf("Unsupported type!\n");。
| 上下文 | 作用 | 示例 |
|---|---|---|
switch 语句 |
默认分支,当表达式的值与所有 case 都不匹配时执行。 |
switch (day) { case 1: ...; default: ...; } |
_Generic 选择 |
后备选项,当表达式的类型与所有指定类型都不匹配时执行。 | _Generic(x, int, ..., default, ...) |
default 在 C 语言中是一个通用的“兜底”或“后备”机制,在 switch 中,它处理“值不匹配”的情况;在 _Generic 中,它处理“类型不匹配”的情况,理解这两个核心用法,就能掌握 default 在 C 语言中的全部含义。
