在C语言编程中,switch语句是用于处理多分支选择场景的常用语法结构,它能够根据一个整型或枚举类型的表达式取值,跳转到对应的分支执行代码,相比多层嵌套的if else语句,代码结构更清晰,可读性更强。下面我们详细介绍它的使用方法。

switch语句的基本语法
switch语句的基本结构如下:
switch (表达式) {
case 常量1:
// 当表达式的值等于常量1时执行的代码
语句1;
break;
case 常量2:
// 当表达式的值等于常量2时执行的代码
语句2;
break;
// 可以有多个case分支
default:
// 当表达式的值不匹配任何case常量时执行的代码
语句n;
break;
}
其中各个部分的含义如下:
- 表达式:必须是整型(包括char类型,因为char本质也是整型)或者枚举类型,不能是浮点型、字符串等非整型类型。
- case 常量:每个case后面必须跟一个整型常量或者常量表达式,且各个case的常量值不能重复。
- break:用于跳出整个switch语句,如果不写break,程序会继续执行下一个case分支的代码,直到遇到break或者switch结束。
- default:可选分支,当表达式的值不匹配任何case的常量时,会执行default下的代码,default可以放在switch结构的任意位置,通常放在所有case的最后。
简单使用示例
下面通过一个判断成绩等级的例子来展示switch的基本用法,根据输入的分数段输出对应的等级:
#include <stdio.h>
int main() {
int score;
printf("请输入分数(0-100):");
scanf("%d", &score);
// 将分数除以10得到整型结果,简化case分支
int level = score / 10;
switch (level) {
case 10:
case 9:
printf("成绩等级为:An");
break;
case 8:
printf("成绩等级为:Bn");
break;
case 7:
printf("成绩等级为:Cn");
break;
case 6:
printf("成绩等级为:Dn");
break;
default:
printf("成绩等级为:En");
break;
}
return 0;
}
这个例子中,当输入的分数是95时,level的值为9,匹配case 9的分支,输出等级A;如果输入的分数是82,level为8,匹配case 8的分支,输出等级B。这里case 10和case 9没有写执行语句和break,是因为它们会共用case 9下面的执行逻辑,这是switch语句中常见的省略写法。
break的作用演示
如果去掉break会发生什么?我们看下面的示例:
#include <stdio.h>
int main() {
int num = 2;
switch (num) {
case 1:
printf("执行case 1n");
case 2:
printf("执行case 2n");
case 3:
printf("执行case 3n");
default:
printf("执行defaultn");
}
return 0;
}
运行这个程序,输出结果会是:
执行case 2
执行case 3
执行default
这是因为当num等于2匹配到case 2之后,由于没有break,程序会继续往下执行case 3和default的代码,这种现象叫做case穿透。在实际开发中,除非有特殊需求,否则每个case分支末尾都需要加上break来避免不必要的穿透。
使用注意事项
- switch后面的表达式类型只能是整型或者枚举类型,不能是float、double、char*等类型,比如
switch(3.14)这种写法是错误的。 - case后面的必须是常量,不能是变量或者变量表达式,比如
case score或者case a+1(a是变量)都是错误的。 - default分支不是必须的,如果没有default,且所有case都不匹配,那么整个switch语句不会执行任何代码。
- switch语句可以嵌套使用,内层的switch和外层的switch之间不会相互影响,case和default标签只在其所属的switch块内有效。
嵌套switch示例
下面展示一个简单的嵌套switch用法:
#include <stdio.h>
int main() {
int type = 1;
int sub_type = 2;
switch (type) {
case 1:
printf("当前类型为1n");
switch (sub_type) {
case 1:
printf("子类型为1n");
break;
case 2:
printf("子类型为2n");
break;
default:
printf("未知子类型n");
}
break;
case 2:
printf("当前类型为2n");
break;
default:
printf("未知类型n");
}
return 0;
}
这个程序中,外层switch匹配type为1的分支,然后进入内层的switch判断sub_type的值,最终会输出当前类型为1和子类型为2的内容。