0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Switch case中的case顺序

麦辣鸡腿堡 来源:轩哥谈芯 作者:Debug 2023-11-20 18:16 次阅读

Switch case中的case顺序

Switch 可能转化成多种不同算法的代码。其中最常见的是跳转表和比较链/树。当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以,可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高性能。

此外,在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以把switch 转化成跳转表。

不好的代码:

int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
case 28:
case 29:
short_months ++;
breakcase 30:
normal_months ++;
breakcase 31:
long_months ++;
breakdefault:
cout < < "month has fewer than 28 or more than 31 days" < < endl;
    break;
}

推荐的代码:

int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
case 31:
long_months ++;
breakcase 30:
normal_months ++;
breakcase 28:
case 29:
short_months ++;
breakdefault:
cout < < "month has fewer than 28 or more than 31 days" < < endl;
    break;
}

提升循环的性能

要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。

不好的代码(在for()中包含不变的if()):

for( i ...)
{
if( CONSTANT0 )
{
  DoWork0( i );// 假设这里不改变CONSTANT0的值
}
else
{
DoWork1( i );// 假设这里不改变CONSTANT0的值
}
}

推荐的代码:

if( CONSTANT0 )
{
for( i 。。。)
{
DoWork0( i );
}
}
else
{
for( i 。。。)
{
DoWork1( i );
}
}

如果已经知道if()的值,这样可以避免重复计算。虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。

选择好的无限循环写法

编程中,我们常常需要用到无限循环,常用的两种方法是while (1)for (;;)。这两种方法效果完全一样,但哪一种更好呢?让我们看看它们编译后的代码。

编译前:

while (1);

编译后:

mov eax,1
test eax,eax
je foo+23h
jmp foo+18h

编译前:

for (;;);

编译后:

jmp foo+23h

显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Switch
    +关注

    关注

    1

    文章

    532

    浏览量

    58156
  • C语言
    +关注

    关注

    180

    文章

    7598

    浏览量

    136158
  • 程序
    +关注

    关注

    116

    文章

    3775

    浏览量

    80840
  • 代码
    +关注

    关注

    30

    文章

    4743

    浏览量

    68343
收藏 人收藏

    评论

    相关推荐

    LabVIEWcase结构问题

    请问,在LabVIEW怎么样数据在连个CASE结构传递,还有就是怎样将数据从同一CASE的true传递到FALSE
    发表于 11-09 00:12

    (急求)LabVIEWCASE问题

    请问,在LabVIEW怎么样数据在连个CASE结构传递,还有就是怎样将数据从同一CASE的true传递到FALSE
    发表于 11-09 00:29

    关于case顺序问题,请小伙伴们指点指点

    switch case 要不要一定按顺序放比如case 1:case 2:
    发表于 07-15 16:02

    C语言switch case怎么执行

    switch(temp){case a: for(i=0;i
    发表于 03-22 07:27

    高效的C编程之Switch语句

    14.6 Switch语句 编译器通常将C语言中的Switch语句编译一个查找表(Table Lookup)以便跳转到合适的入口处。 下面的例子显示了编译器如何处理程序Switch
    发表于 10-17 16:55 4次下载

    C语言的switch case多分支选择语句的详细资料说明

    1、switch-case开关语句是一种多分支选择语句,用来实现多方向条件分支。虽然采用if-else条件判断语句也可以实现多方向条件分支,但是当分支较多时,使用if-else条件语句的嵌套层次会
    发表于 07-12 17:39 1次下载
    C语言的<b class='flag-5'>switch</b> <b class='flag-5'>case</b>多分支选择语句的详细资料说明

    C语言switchcase标签简析

    最近在看一些开源的东西,发现switchcase标识仅仅只是一个标签,跟使用goto语句所定义的label标签是类似的。
    发表于 08-05 17:43 1453次阅读
    C语言<b class='flag-5'>switch</b><b class='flag-5'>中</b>的<b class='flag-5'>case</b>标签简析

    Verilog的If语句和case语句介绍

    。这些语句统称为顺序语句。case 语句和 if 语句都是 verilog 顺序语句的示例。在这篇文章的其余部分,我们将讨论如何在verilog中使用这两个语句。然后,我们考虑这两个
    的头像 发表于 05-11 15:37 4308次阅读
    Verilog<b class='flag-5'>中</b>的If语句和<b class='flag-5'>case</b>语句介绍

    CASE:创建多路分支

    CASE:创建多路分支 说明 使用“创建多路分支”指令,可以根据表达式的值执行多个指令序列的一个。 表达式的值必须为整数或位字符串。执行 CASE 指令时,会将表达式(变量)的值与多个常数的值进行
    的头像 发表于 06-27 11:46 797次阅读
    <b class='flag-5'>CASE</b>:创建多路分支

    case后边可以跟多个语句吗

    是的,"case" 后面可以跟多个语句。在编程语言中,"case" 通常被用于 switch 语句中,用于检查一个变量或表达式是否匹配某个特定的值。当匹配成功时,可以执行一个或多个语句。 下面是一个
    的头像 发表于 11-30 14:19 6387次阅读

    java switch case的语法规则

    在Javaswitch case语句是一种用于多分支选择的控制流语句。它允许根据某个表达式的值来执行不同的代码块。下面是关于switch cas
    的头像 发表于 11-30 14:40 2147次阅读

    java switch case值能为枚举值吗

    Javaswitch语句可以接受枚举类型的值作为参数。在Java,枚举是一种特殊的数据类型,它定义了一个固定数量的命名常量。因此,可以将枚举值作为switch语句的
    的头像 发表于 11-30 14:41 5078次阅读

    java switch case 能不能用字符串

    fruit = "apple" ; switch (fruit) { case "apple" :System.out.println( "This is an apple." ); break ; case "orange"
    的头像 发表于 11-30 14:46 1954次阅读

    javaswitch语句 case的取值

    Javaswitch语句是一种用于多重条件判断的语句,用于根据不同的条件执行不同的代码块。在switch语句中,case关键字用来指定不同的取值。 在Java
    的头像 发表于 11-30 16:05 1082次阅读

    oracle case when 语法介绍

    Oracle的CASE WHEN语法是一种在数据库查询中使用的条件语句,它提供了一种在SELECT语句中根据条件对结果进行转换或筛选的方法。在本文中,我们将详细介绍Oracle的CASE WHEN
    的头像 发表于 12-06 10:21 1697次阅读