default 是 switch 语句的一部分,它的作用是提供一个“默认”或“其他所有情况”的执行分支。

(图片来源网络,侵删)
核心概念:switch 语句的“收尾工作”
default 关键字必须用在 switch 语句中。switch 语句允许一个变量根据其值与多个 case 标签进行比较,并执行匹配的代码块。
default 的作用就是:switch 中表达式的值与任何一个 case 标签的值都不匹配,那么程序就会执行 default 标签下的代码块。
你可以把它想象成一个 if-else if-else 结构中的最后的 else:
// if-else if-else 结构
if (条件1) {
// ...
} else if (条件2) {
// ...
} else { // 这里的 else 就相当于 switch 中的 default
// ...
}
语法结构
default 的语法非常简单,它通常放在 switch 语句的末尾,但也可以放在任何位置(不过放在末尾最符合逻辑和可读性)。
switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时,执行这里的代码
break;
case constant2:
// 当 expression 的值等于 constant2 时,执行这里的代码
break;
// ... 可以有更多的 case
default:
// 当 expression 的值不等于任何一个 case 时,执行这里的代码
break;
}
注意:
default是可选的,一个switch语句可以没有default。- 每个
case和default后面的代码块通常以break;以防止“贯穿”(fall-through)到下一个case或default,我们稍后会详细解释这个概念。
代码示例
让我们通过几个例子来理解 default 的用法。
示例1:基本用法(提供默认操作)
假设我们要根据一个学生的分数(0-100)给出评级,但如果分数不在0-100范围内,则提示输入错误。
#include <stdio.h>
int main() {
int score = 85;
printf("请输入学生的分数 (0-100): ");
scanf("%d", &score);
switch (score) {
case 90 ... 100: // C99标准支持的范围写法,或者用多个 case
printf("评级: A\n");
break;
case 80 ... 89:
printf("评级: B\n");
break;
case 60 ... 79:
printf("评级: C\n");
break;
case 0 ... 59:
printf("评级: D\n");
break;
default: // score 不在 0-100 之间
printf("错误:分数无效!请输入0到100之间的数字,\n");
break;
}
return 0;
}
分析:
- 如果用户输入
85,score的值是85,它匹配case 80 ... 89,打印 "评级: B"。 - 如果用户输入
95,匹配case 90 ... 100,打印 "评级: A"。 - 如果用户输入
-5或150,score的值不匹配任何一个case,程序就会跳转到default分支,打印 "错误:分数无效!..."。
示例2:default 的位置(不一定要在最后)
虽然 default 通常放在最后,但它可以放在任何位置,这会影响代码的执行逻辑,可能会降低可读性。
#include <stdio.h>
int main() {
int value = 5;
switch (value) {
default:
printf("这是默认分支,因为值不匹配任何 case,\n");
break;
case 1:
printf("值是 1\n");
break;
case 2:
printf("值是 2\n");
break;
}
return 0;
}
分析:
value是5。- 程序从上到下检查
case,发现5不等于1,也不等于2。 - 它跳到
default分支并执行其中的代码。 - 输出结果为:
这是默认分支,因为值不匹配任何 case。
这个例子说明,default 的执行不依赖于它在代码中的物理位置,而是依赖于逻辑上的“不匹配”。
重要概念:break 和 “贯穿” (Fall-Through)
这是理解 switch 语句最关键的一点。
break;:当执行到break;时,程序会立即跳出整个switch语句,继续执行switch之后的代码。- “贯穿” (Fall-Through):如果某个
case或default分支的末尾没有break;,程序会“掉下去”,继续执行下一个case或default分支的代码,直到遇到一个break;或者switch语句结束。
示例3:利用“贯穿”特性
假设我们要统计一个元音字母(a, e, i, o, u),我们可以利用 fall-through 来简化代码。
#include <stdio.h>
int main() {
char ch = 'e';
switch (ch) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf("%c 是一个元音字母,\n", ch);
break; // 这个 break 会终止所有元音字母的匹配
default:
printf("%c 是一个辅音字母或其它字符,\n", ch);
break;
}
return 0;
}
分析:
ch的值是'e'。- 程序检查
case 'a',不匹配。 - 继续检查
case 'e',匹配。 - 由于
case 'e'后面没有break;,程序会“贯穿”到下一个case,即case 'i'。 case 'i'也没有break;,继续贯穿到case 'o'。case 'o'也没有break;,继续贯穿到case 'u'。case 'u'后面有break;,程序终于跳出switch语句。- 最终打印:
e 是一个元音字母。
这种写法非常简洁,避免了重复的 printf 语句。
| 特性 | 描述 |
|---|---|
| 作用 | 作为 switch 语句的一部分,处理所有不匹配任何 case 的情况。 |
| 位置 | 可以放在 switch 语句内的任何位置,但通常放在末尾以提高可读性。 |
| 可选性 | default 分支是可选的,如果没有 default,且没有 case 匹配,则 switch 语句不执行任何操作。 |
与 break 的关系 |
default 分支的末尾通常需要 break; 来防止代码“贯穿”到后续的 case(default 不在末尾)。 |
| 高级用法 | 可以故意省略 default 或某个 case 的 break; 来利用“贯穿”特性,实现更复杂的逻辑,如示例3。 |
default 是C语言中 switch 语句一个非常有用的组成部分,它让程序能够处理那些“意料之外”或“未明确指定”的输入情况,使代码更加健壮和完整。
