1.switch基础语句
前面我们已经学习了if...else if...else等的相关判断,他们比较适合做范围判断 ,比如分数大于90、年龄小于18等,但如果你的需求是:把一个变量和多个固定值做匹配,比如判断星期几、判断运算符、判断菜单选项时,用switch会更清晰、高效。
switch语句基本语法
switch (变量或表达式)
{
case 常量1:语句1;break;
case 常量2:语句2;break;
case 常量3:语句3;break;
...
case 常量n:语句n;break;
default:语句n+1;break; //都不匹配时执行的语句
}
注意要点:
- switch后面的变量或表达式 只能是int/char类型,不能是float、double类型或字符串。
- case后面必须是常量,不能是变量。
- break表示跳出整个switch。,不写会发生"穿透"
- default是可选的,相当于else。
示例:判断星期几
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day;
printf("请输入一个数字1-7:");
scanf("%d", &day);
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("输入无效\\n"); break;
}
return 0;
}
结果:
请输入一个数字1-7:4
星期四
如果某个case后面没有break,程序会继续往下执行,直到遇到break或switch结束,这叫case穿透。
没有break的情况:

示例:判断字母
char c;
printf("请输入一个字符:");
scanf("%c", &c);
switch (c)
{
case 'a':
printf("是小写字母a\\n"); break;
case 'A':
printf("是大写字母A\\n"); break;
default:
printf("输入的不是字母a或A\\n"); break;
}
结果:
请输入一个字符:a
是小写字母a
switch最常见的4个错误
- 把float放进switch→编译报错
- case后面写变量→编译报错
- 忘记写break→结果乱跳(穿透)
- default乱放位置→逻辑混乱
2.switch和if...else的选择
| 场景 | 推荐语句 |
|---|---|
| 判断范围(>、<、>=) | if...else if |
| 判断固定值(1、2、3、'A') | switch |
| 多层复杂逻辑 | if 嵌套 |
| 菜单、运算符、数字选项 | switch |
3.switch嵌套
switch嵌套的关键:内层switch完全包裹在外层case的代码块中,内层break仅跳出内层switch,不会影响外层。
//外层switch:匹配大类
switch (外层变量)
{
case 外层变量1:
//内层switch:匹配小类
switch (内层变量)
{
case 内层变量1:语句;break;
case 内层变量2:语句;break;
...
default:语句;break;
}
case 外层变量n:语句n;break;
default:语句;break;
}
注意:break只作用于当前switch,不会跳出外层,如果需要跳出外层,结合goto或提前结束逻辑。
示例:简单点餐系统
需求:1.外层选择品类:1=快餐,2=饮品;
2.内层根据品类选具体商品:
快餐类:1=汉堡,2=炸鸡;
饮品类:1=可乐,2=奶茶;
3.输入错误提示:选择无效。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int category, product; //category=品类,product=产品
printf("/*------点餐系统------*/\\n");
printf("请选择品类,1是快餐,2是饮品:");
scanf("%d",&category);
switch (category)
{
case 1:
printf("/*-----快餐菜单-----*/\\n");
printf("1.汉堡(25元);2.炸鸡(30元)\\n请选择商品:");
scanf("%d",&product);
switch (product)
{
case 1:printf("选择了汉堡(25元)\\n"); break;
case 2:printf("选择了炸鸡(30元)\\n"); break;
default:printf("快餐选项出错\\n"); break;
}
break;
case 2:
printf("/*-----饮品菜单-----*/\\n");
printf("1.可乐(8元),2.奶茶(15元)\\n请选择饮品:");
scanf("%d", &product);
switch (product)
{
case 1:printf("选择了可乐(8元)\\n"); break;
case 2:printf("选择了奶茶(15元\\n)"); break;
default:printf("饮品选项出错\\n"); break;
}
break;
default:printf("品类选项出错,重新选择\\n"); break;
}
return 0;
}
//结果
/*------点餐系统------*/
请选择品类,1是快餐,2是饮品:1
/*-----快餐菜单-----*/
1.汉堡(25元);2.炸鸡(30元)
请选择商品:2
选择了炸鸡(30元)
提示:
- switch 嵌套核心:内层 switch 包裹在外层 case 中,内层 break 仅跳出内层,外层 break 跳出外层;
- 适用场景:双层等值判断(大类 + 小类),层数建议≤2 层;