if else 和 switch case 总结

时间:2022-01-15 20:42:28

关于两者的优缺点如下:

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比较灵活。