1#include
2#include
3
4void Function(int statue)
5{
6 switch(statue)
7 {
8 case 0:
9 {
10 printf("123");
11 case 1: //注意!!!
12 printf("456\n");
13
14 }break;
15 default:break;
16 }
17}
18
19int main(int argc, char *argv[]) {
20
21 Function(0);
22 Function(1);
23 return 0;
24}
按照我们平时的编程习惯和风格,case应该拥有自己的代码块才对,怎么在上面的代码中case 1放到了case 0中,能编译通过吗?
既然代码都写出来了,编译肯定是没有问题的,并且还能正确输出如下结果:
根据结果,也就说明当statue等于1的时候,switch会直接跳转到匹配的标签处,而不会管所谓的代码块。
所以前面也说了,有点goto的感觉了~
有朋友该说了,bug菌,这也太影响程序的可读性了吧,有问题bug都不好找~
确实,这样的做法在编码风格中算是摒弃的,但是也不能因为要注意编码风格而限制了我们对C语言编程的想象,比如下面这个有名的算法就利用了这点:
汤姆·达夫利用C语言switch语句这种特性优化了串行复制算法--达夫设备(英文:Duff's device)
我们平时要复制一块数据会使用如下编码实现:
1void MyCopy( int * Dst, int * Src, int count)
2{
3 int i = 0;
4
5 for(i = 0;i != count; ++i)
6 {
7 *Dst ++ = *Src ++ ;
8 }
9}
应该够简单吧,那再看看达夫怎么处理的:
1void duff_Copy( int * to, int* from, int count)
2 {
3 int n = (count+7)/8;
4
5 switch( count%8 )
6 {
7 case 0: do{ *to++ = *from++;
8 case 7: *to++ = *from++;
9 case 6: *to++ = *from++;
10 case 5: *to++ = *from++;
11 case 4: *to++ = *from++;
12 case 3: *to++ = *from++;
13 case 2: *to++ = *from++;
14 case 1: *to++ = *from++;
15 }while(--n > 0);
16 }
17}
最后
好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个赞~
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
猜你喜欢:
一个很棒的智能配网方案!
分享一款小巧好用的代码对比工具
一个300多行代码实现的多任务管理的OS
分享嵌入式中几个实用的shell脚本!
分享一份嵌入式软件工具清单!
在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。