当前位置: 首页 > article >正文

【C语言】switch语句的理解

文章目录

  • 一. 基本语法结构
  • 二. 几点补充
    • 补充一:关于 default 分支
    • 补充二:多条匹配执行同一语句
    • 补充三:在 case 语句中定义变量的问题
  • 三. 几点建议
    • 建议一:按执行频率排列 case 语句
    • 细节二:简化每种情况对应的操作
    • 细节三:将 default 字句只用于检查真正的默认情况

一. 基本语法结构

任何具有判定能力的语法结构,都必须具备 判定+分支 功能

在 switch 语法结构中:

  • case 完成的判定功能
  • break 完成的是分支功能
  • default 处理异常情况
    在这里插入图片描述

举例

根据输入的数字,打印出今天是星期几

int main()
{
	int day = 0;
	while (1)
	{
		printf("Please Enter Your Day# ");
		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("input error\n");
			break;
		}
	}
	return 0;
}

编译运行:
在这里插入图片描述

二. 几点补充

补充一:关于 default 分支

每次写 switch 语句时,即使程序真的不需要 default 处理,也应该保留以下语句:

default:
	break;

这并非画蛇添足,可以避免让人误以为你忘了 default 处理。而且本来 switch 就适合用在分支较多的情况,最后的 default 也可以方便后续维护代码。

PS:语义上 default 应该放在结尾处,但实际上它可以放在 switch 中的任何地方。

补充二:多条匹配执行同一语句

case 本身是用来进行判断的,当一次判断完成后,其他所有的 case 都将失效(相当于被注释掉),所以当我们想要多条 case 执行同一语句时,可以把这些 case 堆叠在一起。

举例

根据输入的数字,判定今天是周内还是周末

int main()
{
	int day = 0;
	while (1)
	{
		printf("Please Enter Your Day# ");
		scanf("%d", &day);
		switch (day) 
		{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("周内\n");
			break;
		case 6:
		case 7:
			printf("周末\n");
			break;
		default:
			printf("input error\n");
			break;
		}
	}
	return 0;
}

编译运行:

补充三:在 case 语句中定义变量的问题

下面代码在 case 语句中定义了一个 n 变量

int main()
{
	switch (7)
	{
	case 1:
		int n = 10;
		break;
	default:
		break;
	}
	return 0;
}

编译器会报错:
在这里插入图片描述

如果我们这样写(在变量定义的地方加上"{}"):

int main()
{
	switch (7)
	{
	case 1:
	{int n = 10; }
		break;
	default:
		break;
	}
	return 0;
}

编译器就不会报错,原因如下:

C++编译器考虑了如下的情况:倘若在case 1中定义了一个变量,由于case 1和 default 都在同一个作用域,因此 default 可以调用case 1的变量;如果 default 这样做了,看看会发生什么情况——将会跳过case 1而执行 default,但 default 调用的case 1的变量还没有定义,因此会发生错误!

为了防止这样情况,就需要在case 1中定义变量的部分加上"{}",以限制变量的作用域(防止被 default 调用),从而防止出错。

假设 default 一定要调用case 1中的变量,那就把这个变量定义成全局变量。

三. 几点建议

建议一:按执行频率排列 case 语句

把最常执行的情况放在前面,而把最不常执行的情况放在后面。这样做有两个好处:

  • 最常执行的代码可能也是调试的时候要单步执行最多的代码。如果放在后面的话,找起来可能会比较困难,而放在前面的话,可以很快找到。
  • 程序执行运行起来,匹配的时候可以较少次的匹配。

细节二:简化每种情况对应的操作

写 case 时,建议使得与每种情况相关的代码尽可能的精炼。case 语句后面的代码越精炼,case 语句的结果就会越清晰。试想,如果case语句后面的代码整个屏幕都放不下,这样的代码谁也很难看得清晰吧。如果某个 case 语句确实需要这么多的代码来执行某个操作,那可以把这些操作写成一个或几个函数,然后在 case 语句后面调用这些函数就ok了。一般来说,case语句后面的代码尽量不要超过20行。

细节三:将 default 字句只用于检查真正的默认情况

有时候,你只剩下了最后一种情况需要处理,于是就决定把这种情况用default 子句来处理。这样也许会让你偷懒少敲几个字符,但是这却很不明智。因为这样将失去 case 语句的标号所提供的自说明功能,而且也丧失了使用 default 子句处理错误情况的能力。所以最好老老实实地把每一种情况都用case 语句来完成,而把真正默认情况的处理交给 default 子句。


http://www.kler.cn/a/9746.html

相关文章:

  • MySQL与Oracle对比及区别
  • 陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解
  • uniapp使用scroll-view下拉刷新与上滑加载
  • 【前端学习指南】Vue computed 计算属性 watch 监听器
  • 不对称信息
  • 文献解读-DNAscope: High accuracy small variant calling using machine learning
  • 【RocketMQ】消息的拉取
  • 发布jar到maven中央仓库
  • 简单实用的IntelliJ IDEA集成配置Maven教程:高效构建Java项目
  • MAC 删除自带 ABC 输入法的方法
  • maya arnold自定义aov分层灯光组添加方法
  • 算法笔记-换根DP
  • OKR系统改变您的团队
  • 【职场篇】程序员是否吃青春饭?程序员在35岁之后是否需要转行?
  • Thingsboard开源物联网平台智慧农业实例快速部署教程(三)【源码部署及logo更换】
  • 延迟渲染到最终结果---大象无形(11.3.1)--2,PrePass预处理阶段--<1>判断是否预处理
  • 全球十大正规黄金期货交易APP平台排名(2023版榜单)
  • C# 获取当前设备硬件信息
  • (二)nvidia jetson orin nvcsi tegra-capture-vi camera相关内容梳理 之 nvcsi相关代码分析
  • 聚观早报 | ChatGPT 停止 Plus 付费;李子柒油管广告收益登顶热搜
  • 纺织工业库房如何有效防潮?恒温恒湿真的有效吗?
  • 从中序和前序遍历序列构造二叉树
  • 系统集成项目管理工程师软考第一章习题(已完结)
  • JavaScript基础04 - BOM编程
  • 外包干了四年,感觉废了..
  • 浅谈自动化测试用例创建和文档