物联网
您现在所在的位置:首页>企业动态>物联网

C语言编程case标签详解,case用法及作用

编辑:学到牛牛IT培训    发布日期: 2022-03-25 09:44:17  

最近在看一些开源的东西,发现switch中的case标识仅仅只是一个标签,跟使用goto语句所定义的label标签是类似的。

这样说可能大家还不是很好理解,下面给一个小例子了解一波:

#include <stdio.h>
#include <stdlib.h>

void Function(int statue)
{
    switch(statue)
    {
        case 0:
        {
            printf("123");
            case 1: //注意!!!
            printf("456
");

        }break;
        default:break;
    }
}

int main(int argc, char *argv[]) {

    Function(0);
    Function(1);
    return 0;
}

按照我们平时的编程习惯和风格,case应该拥有自己的代码块才对,怎么在上面的代码中case 1放到了case 0中,能编译通过吗?

既然代码都写出来了,编译肯定是没有问题的,并且还能正确输出如下结果:

C语言编程.png

根据结果,也就说明当statue等于1的时候,switch会直接跳转到匹配的标签处,而不会管所谓的代码块。

所以前面也说了,有点goto的感觉了~

有朋友该说了,bug菌,这也太影响程序的可读性了吧,有问题bug都不好找~

确实,这样的做法在编码风格中算是摒弃的,但是也不能因为要注意编码风格而限制了我们对C语言编程的想象,比如下面这个有名的算法就利用了这点:

汤姆·达夫利用C语言switch语句这种特性优化了串行复制算法--达夫设备(英文:Duff's device)

我们平时要复制一块数据会使用如下编码实现:

void  MyCopy( int * Dst, int * Src, int count)
{
    int i = 0;

    for(i = 0;i != count; ++i) 
    {
      *Dst ++  = *Src ++ ;
    } 
}

应该够简单吧,那再看看达夫怎么处理的:

void duff_Copy( int * to, int* from, int count)
{
    int n = (count+7)/8;

    switch( count%8 ) 
   {    
     case 0: do{ *to++ = *from++;
     case 7:     *to++ = *from++;
     case 6:     *to++ = *from++;
     case 5:     *to++ = *from++;
     case 4:     *to++ = *from++;
     case 3:     *to++ = *from++;
     case 2:     *to++ = *from++;
     case 1:     *to++ = *from++;
               }while(--n > 0);
    }
}

达夫设备进行数据复制,就是利用了switch会直接跳转到case标签处进行继续运行,如果没有break语句,继续执行下面的内容,直到while循环退出。

相比我们常用的数据拷贝MyCopy,每拷贝一个数据就要判断一次循环计数是否达到。

而达夫则以8个数据为一组(当然你可以设计得更多,不过太多在效率上就优化得不明显了),首先做了取余的处理,把不能成组的数据优先copy,然后判断一次循环截止条件,如果不满足,后续就一直是8个一组进行copy并进行循环截止判断,直到while循环退出,这样的拷贝效率当然比我们传统的for循环处理方式要高。

写到这里,bug菌在想,为什么这段代码不直接用汇编来写呢?因为功能上比较简单,用汇编实现也不是什么难事,并且能够根据平台的一些特性进行指令上的优化。

后来又想了想,可能一方面考虑到C语言相对可移植性会更好一点,另一方面或许达夫就是酷爱用C语言编程吧。


文章来源:最后一个bug

声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 

免费试学
课程好不好,不如实地听一听

封闭学习

2

1

联系我们

电话:028-61775817

邮箱:1572396657@qq.com

地址:成都市金牛区西城国际A座8楼

  • 物联网_物联网专题新闻_物联网IOT资讯-学到牛牛
    物联网_物联网专题新闻_物联网IOT资讯-学到牛牛

    扫一扫,免费咨询

  • 物联网_物联网专题新闻_物联网IOT资讯-学到牛牛
    物联网_物联网专题新闻_物联网IOT资讯-学到牛牛

    微信公众号

  • 物联网_物联网专题新闻_物联网IOT资讯-学到牛牛
物联网_物联网专题新闻_物联网IOT资讯-学到牛牛

学一流技术,找高薪工作

物联网_物联网专题新闻_物联网IOT资讯-学到牛牛

7-24小时服务热线:

028-61775817

版权声明 网站地图

蜀ICP备2021001672号

课程问题轻松问