最近在看一些开源的东西,发现switch中的case标识仅仅只是一个标签,跟使用goto语句所定义的label标签是类似的。这样说可能大家还不是很好理解,下面给一个小例子了解一波:
按照我们平时的编程习惯和风格,case应该拥有自己的代码块才对,怎么在上面的代码中case 1放到了case 0中,能编译通过吗?
既然代码都写出来了,编译肯定是没有问题的,并且还能正确输出如下结果:
根据结果,也就说明当statue等于1的时候,switch会直接跳转到匹配的标签处,而不会管所谓的代码块。
所以前面也说了,有点goto的感觉了~
有朋友该说了,这也太影响程序的可读性了吧,有问题bug都不好找~
确实,这样的做法在编码风格中算是摒弃的,但是也不能因为要注意编码风格而限制了我们对c语言编程的想象,比如下面这个有名的算法就利用了这点:
汤姆·达夫利用c语言switch语句这种特性优化了串行复制算法--达夫设备(英文:duff's device)
我们平时要复制一块数据会使用如下编码实现:
应该够简单吧,那再看看达夫怎么处理的:
达夫设备进行数据复制,就是利用了switch会直接跳转到case标签处进行继续运行,如果没有break语句,继续执行下面的内容,直到while循环退出。
相比我们常用的数据拷贝mycopy,每拷贝一个数据就要判断一次循环计数是否达到。
而达夫则以8个数据为一组(当然你可以设计得更多,不过太多在效率上就优化得不明显了),首先做了取余的处理,把不能成组的数据优先copy,然后判断一次循环截止条件,如果不满足,后续就一直是8个一组进行copy并进行循环截止判断,直到while循环退出,这样的拷贝效率当然比我们传统的for循环处理方式要高。
写到这里,小编在想,为什么这段代码不直接用汇编来写呢?因为功能上比较简单,用汇编实现也不是什么难事,并且能够根据平台的一些特性进行指令上的优化。后来又想了想,可能一方面考虑到c语言相对可移植性会更好一点,另一方面或许达夫就是酷爱用c语言编程吧。
科技巨头争相入局,卫星通信领域将迎来怎样的发展?
光耀夺目——雷神K75透明三模机械键盘
AI推动的智能环境时代已然到来,人工智能领域兴起环境计算
PLC控制步进电机的速度和角度 PLC控制柜由哪些元件组成
166亿!紫光集团披露两年来交易金额最大海外投资交易
C语言switch中的case标签简析
安卓工控主板双网口有什么用途
BPA861X|高品质BPA系列家电AC/DC芯片
丹邦科技募资17.8亿研发量子碳化合物半导体膜 有望在化合物半导体材料领域实现重大技术突破
UltraSoC宣布RISC-V处理器跟踪IP产品开始全面供货
路由器是干什么用的 路由器怎样桥接另一个路由器
物联网降低维护成本的策略有哪些
德州仪器指纹识别设计注意事项
RISC-V架构师从过去指令集设计的错误中吸取的教训
自动控制系统 伺服系统工作原理
PPM-WS壁挂式温湿度变送器的技术参数及特点
日本的LNG接收站数量居全球第一,年接收能力达2.11亿吨
中国移动发布了2020年至2021年低端路由器和低端交换机采购招标公告
游戏系列的A5和A7型号具有AMD的Ryzen系列移动处理器
一文带你真正搞明白比特币