关于两者的优缺点如下:
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比较灵活。