zoukankan      html  css  js  c++  java
  • if else 和 switch case 总结

    关于两者的优缺点如下:

    1.if else的优缺点

      缺点:效率低(相对于switch)

      优点:使用灵活,代码空间小

    2.switch的优缺点

       缺点:不够灵活,switch仅支持 int,char,unsigned char 等基本类型;代码空间大。

       优点:代码结构清晰,效率高

    其实,对于if else 作为关键字而言,效率还是可以的。

    下面是一个比较权威的说法:

    《C++ Footprint and Performance Optimization》的7章,第一节。
    然后根据大量的实际程序测试(不考虑不同的编译器优化程度差异,假设都是最好的优化),那么Switch语句击中第三个选项的时间跟if/else if语句击中第三个选项的时间相同。
    击中第一,第二选项的速度if语句快,击中第四以及第四之后的选项的速度switch语句快。

    switch底层执行原理     

       switch语句根据一个整数索引值进行多重分支,底层采用跳转表这种数据结构。跳转表是一个数组,表项 i 对应代码段的地址,当switch索引值等于表项i时采取对应的程序操作。

    简单可理解为:执行switch时生成一个长度为最大case常量+1的数组,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得数组索引号为switch变量值大小,取得数组对应值即为相应case代码块地址,程序接着跳到此地址执行,完成分支的跳转。

     对于if-else,在系统是自上而下逐个条件去判断,直到命中;所以应将机率大的条件置于最前面。以下给出一个简单例子

    var random = Math.random()*100;//生成0-100的随机数
    if(random > 10){ //90%
    
    }else if(random > 5){//5%
    
    }else{//剩下的5%
    
    }

    对于条件机率相等或是条件个数非常多的情况,因为switch的执行时间与条件数量无关,他是根据switch值直接跳转到对应分支,所以可以选择switch代替if-else。

    var random = Math.random() * 100;// 生成0-100的随机数
       switch (random) {
        case 0:
            break;case 100:
            break;
       }

    对于switch,实际上是根据case最小值与最大值,维系了一段连续的内存空间,以空间换取时间。以下给出一个简单的反例,最大值与最小值跨度较大,且之间没有更多的条件情况,那个无疑实际申请的很多空间是没用的,所以就应考虑使用if-else在代替。

    总结:.switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (x > 1 && x < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。

  • 相关阅读:
    十八、SAP中使用IF/ELSE判断语句,以及sy-subrc的用法
    十七、SAP中使用SQL语句读取一条数据
    十六、SAP中查看数据库
    十五、SAP自定义结构体
    十四、SAP中定义自定义变量
    十三、SAP中定义变量时赋初始值
    十二、Sap的压缩类型p的使用方法
    十一、SAP文本变量,并设置长度
    十、SAP小数需要用引号括起来
    九、SAP中使用定义时间及使用sy-uzeit取当前时间
  • 原文地址:https://www.cnblogs.com/zxrbky/p/9466649.html
Copyright © 2011-2022 走看看