C语言优化实例:一种消除嵌套switch-case的巧妙做法

我们有可能会写出或者遇到类似这样的代码:

C/C++

    switch (expr1)
    {
    case label11:
        switch (expr2)
        {
        case label21:
            // do something
            break;
        case label22:
            // do something
            break;
        default:
            // do something
            break;
        }
        break;
    case label12:
        switch (expr2)
        {
        case label21:
            // do something
            break;
        case label22:
            // do something
            break;
        default:
            // do something
            break;
        }
        break;
    case label13:
        switch (expr2)
        {
        case label21:
            // do something
            break;
        case label22:
            // do something
            break;
        default:
            // do something
            break;
        }
        break;
    default:
        // do something
        break;
    }

这时可以考虑将两个嵌套的switch-case语句通过下面的方式转换为一个switch-case语句:

一般地,expr1和expr2的label情况不会太多,值也不会太大,可以先确定expr2的最大label值,也就能确定要表达expr2所需要的最大位数expr2_max_bit,然后把expr2放到new_expr的低位,把expr1放到new_expr的高位,然后就简化为一层switch-case了。

示例如下:

C/C++

    new_expr = expr1 << expr2_max_bit + expr2;
    switch (new_expr)
    {
    case label1:
        // do something
        break;
    case label2:
        // do something
        break;
    case label3:
        // do something
        break;
    case label4:
        // do something
        break;
    case label5:
        // do something
        break;
    case label6:
        // do something
        break;
    default:
        // do something
        break;
    }

注意:通过这种方式并不能消除总的case数,但是可以简化逻辑和代码。

时间: 2024-08-29 15:35:46

C语言优化实例:一种消除嵌套switch-case的巧妙做法的相关文章

C语言优化实例:为了消除嵌套switch-case聪明的做法

我们有可能会写出或者遇到类似这种代码: C/C++ switch (expr1) { case label11: switch (expr2) { case label21: // do something break; case label22: // do something break; default: // do something break; } break; case label12: switch (expr2) { case label21: // do something

C语言优化实例:消除多级指针的间接访问

如果一个多层次的数据结构达到两级或者两级以上,举例如下: struct A{ int array_member[100]; //其他数据成员 }; struct B{ struct A *a_ptr; //其他数据成员 } 那么通过B类型的指针b_ptr访问A类型的array_member的某一个元素array_member[0]则需要使用b_ptr->a_ptr->array_member[0]这种多级指针的形式.如果一个函数中多次用到这个变量的话,可以采用一个临时变量保存这个多级指针:in

C语言优化实例:循环中减少判断

为了让编译器更好地优化循环,应该尽量让循环中减少判断,方法之一是将判断语句整合进表达式.还是这个例子: for (int i = 0; i < 1000*10; i++) { sum += data[i/1000][i%10]; } 假如我们需要加一个判断,只有非负整数才需要作求和运算: for (int i = 0; i < 1000*10; i++) { if (data[i/1000][i%10] >= 0) sum += data[i/1000][i%10]; } 下面将这个判断

(c语言)函数间的调用,switch case

问题描述: 编写以下四个函数: init();//设计函数初始化数组为 1 2 3 4 5 6 7 8 9 10 sort();//设计排序函数,实现数组的降序排列:10 9 8 7 6 5 4 3 2 1 empty();//清空数组,全为0 show();//显示数组 程序分析: 程序的思路:a.先将程序的头和尾写好,在主函数中将要被处理的两个参数(一个数组arr,和数组的长度len).b.再封装那几个函数,额外加上一个menu函数.c.在主函数中用switch case语句调用这几个函数.

PHP程序性能优化的50种方法

用单引号代替双引号来包含字符串,这样做会更快一些.因为 PHP 会在双引号包围的 字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多个字符 串当作参数的“函数”(译注:PHP 手册中说 echo 是语言结构,不是真正的函数,故把函数 加上了双引号). 如果能将类的方法定义成 static,就尽量定义成 static,它的速度会提升将近 4 倍. $row[‘id’] 的速度是$row[id]的 7 倍 echo 比 print 快,并且使用 echo 的多重参数(译

tomcat优化实例

优化实例 启动参数优化JAVA_OPTS='-server -Xms512m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=512m -XX:+UseBiasedLocking -XX:+AggressiveOpts -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+

java语言复制数组的四种方法

JAVA语言的下面几种数组复制方法中,哪个效率最高? B.效率:System.arraycopy > clone > Arrays.copyOf > for循环 1.System.arraycopy的用法: [java] view plain copy public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 参数:src - 源数组.srcPos - 源数组中的起

C语言switch/case圈复杂度优化重构

软件重构是改善代码可读性.可扩展性.可维护性等目的的常见技术手段.圈复杂度作为一项软件质量度量指标,能从一定程度上反映这些内部质量需求(当然并不是全部),所以圈复杂度往往被很多项目采用作为软件质量的度量指标之一. C语言开发的项目中,switch/case代码块是一个很容易造成圈复杂度超标的语言特性,所以本文主要介绍下降低switch代码段的重构手段(如下图).switch圈复杂度优化重构可分为两部分:程序块的重构和case的重构.程序块重构是对代码的局部优化,而case重构是对代码的整体设计,

margin优化的一种思路

写在前面的话: 原文链接:margin优化的一种思路 HTML <div id="main"> <div id="body1"> <div id="content1"></div> </div> <div id="body2"></div> </div> CSS(未优化) #main {margin:5px 0px 5px 0px;