相同及区别
switch和if-else-if是c/c++中的两种分支语句,它们的功能基本相同,都是判断条件后执行相应的动作。
当然它们也有区别,不然为什么同一件事情要用两种不同的方法来做呢?
if-else if-else if-else语句:
- 可以是任何条件语句、变量或者表达式
- 运行时顺序检查所有的条件,直到匹配发生,执行语句并跳过后续
switch case语句:
- 只适用于待判断的条件是整型、字符、枚举。
- case后必须是常量,不能是变量或者表达式
- 编译时根据case值生成查询表,运行时检索查询表,如果存在,则转移控制流到匹配的case,否则执行default语句(建议总是为switch声明default语句)
对于switch的限制,得出一个一般性的结论,所有的switch语句都可以用if-else-if改写,反之则不然。
使用哪一个
对于两者都可以使用的场合,应该选择使用哪一种呢?答案是switch。下面从两个方面说明:
- 性能
由于实现机制的差别,switch使用查询表。它在运行时能直接把程序控制流转移到匹配的case/default。这在性能上较采用顺序比较的if好。
当然,好坏是相对而言的,要根据具体的使用场景分析。
对于只有较少量的条件需要判断的情况下,if-else反而更小更快,一般而言,条件数小于5时是这样。因为这个时候顺序匹配比查询表什么的更快。
这跟查找电话本上的电话号码类似,想象一下,当你只有5个联系人时,要查找一个,是不是直接顺序查看要比建立一个索引表,再到索引处更快?
当有100个联系人时,就没有人会反对建立一个索引表,再去索引相应的电话了。
- 复杂性
复杂性也要看具体情况,但一般而言,if-else-if的复杂性略高,它随判断条件的增多而增加。特别是在嵌套if时,结构较乱。
相较而言,switch更易阅读、编码和维护。当然,嵌套使用switch时复杂性也立刻提高了。
总之,在最坏的情况下,编译器也能生成与if-else相似的代码,而在最佳情况下,优化器可能会找到更好的方式生成代码。
总结
使用if-else-if:
- 需要进行条件语句而必须使用
- 需要判断的条件很少时,一般不超过5个
使用switch-case:
- 能用则用
参考资料
Advantage of switch over if-else statement
If…else…if vs switch…case, difference and usage?
switch vs if else