C语言学习(八)——C判断(switch语句)

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 层;
相关推荐
zhojiew1 小时前
为agent实现渐进式Skills能力的思考和实践
linux·python·算法
科技林总2 小时前
【系统分析师】11.6 软件需求确认和验证
学习
ATAOL2 小时前
数据结构一
数据结构·算法
ZTLJQ2 小时前
深入理解Autoencoder:无监督学习的异常检测与数据压缩利器
学习
zyq99101_12 小时前
Python日期处理实战代码
python·算法·蓝桥杯
夏星印3 小时前
argparse解析器参数详解
经验分享·笔记·python·学习·argparse
Shining05963 小时前
AI编译器系列(二)《AI 编译器中的前端优化》
人工智能·学习·其他·学习方法·infinitensor
码喽7号3 小时前
springboot学习四:RESTful风格+swagger
spring boot·学习·restful
weixin_458872613 小时前
东华复试OJ二刷复盘8
学习