ifelse和switchcase总结
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在代替。
总结:.ase只能处理case为常量的情况,对⾮常量的情况是⽆能为⼒的。例如 if (x > 1 && x < 100),是⽆法使⽤ase来处理的。所以,switch只能是在常量选择分⽀时⽐ifelse效率⾼,但是ifelse能应⽤于更多的场合,ifelse⽐较灵活。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论