switch与if-else-if区别与应用实践

相同及区别

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

你可能感兴趣的:(cpp,c语言基础学习,switch,if-else-if,c/c++,应用实践,效率)