c++ - 为什么切换/Case 而不是 If/Else If?

标签 c++ c switch-statement conditional-statements

这个问题主要针对 C/C++,但我猜其他语言也有关系。

我不明白为什么仍然使用 switch/case 而不是 if/else if。在我看来,这很像使用 goto,并导致相同类型的困惑代码,而使用 if/else if 可以以更有条理的方式实现相同的结果。

不过,我还是经常看到这些街区。找到它们的常见位置是在消息循环(WndProc...)附近,而这些是它们引发最严重破坏的地方之一:变量在整个 block 中共享,即使不合适(并且不能在里面初始化)。必须特别注意不要放弃休息,等等......

就我个人而言,我避免使用它们,我想知道我是否遗漏了什么?

它们是否比 if/else 更有效? 它们是按照传统进行的吗?

最佳答案

总结我最初的帖子和评论 - switch 语句优于 if/else 语句有几个优点:

  1. 更简洁的代码。具有多个链式 if/else if ... 的代码看起来很凌乱且难以维护 - switch 提供更清晰的结构。

  2. 性能。对于密集的 case 值,编译器生成跳转表,对于稀疏 - 二分查找或一系列 if/else,所以在最坏的情况下 switch if/else 一样快,但通常更快。虽然有些编译器可以类似地优化 if/else.

  3. 测试顺序无关紧要。为了加快一系列 if/else 测试,需要首先放置更多可能的案例。有了switch/case,程序员就不需要考虑这个了。

  4. 默认值可以是任何地方。 if/else 的默认大小写必须在最后 - 在最后一个 else 之后。在 switch - default 可以在任何地方,只要程序员认为它更合适。

  5. 通用代码。如果您需要在几种情况下执行通用代码,您可以省略 break 并且执行将“失败” - 这是您无法使用 if/else。 (对于这种情况,放置一个特殊的注释 /* FALLTHROUGH */ 是一个很好的做法 - lint 识别它并且不会提示,如果没有这个注释它会提示,因为它是忘记的常见错误 中断)。

感谢所有评论者。

关于c++ - 为什么切换/Case 而不是 If/Else If?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1028437/

相关文章:

c++ - 使用字符串或字符数组作为文件名?

c - 没有if的if语句?

c - 为什么我的 C 代码无法识别结构数组并重复用户输入?

arrays - 快速切换转换时出错

安卓 : Error occur on custom switch layout

c++ - 使用netbeans编译C++

c++ - 向下转换非多态类型?

C++将循环中的字符串转换为 double

java - Oracle 是用 C 还是 Java 创建的?

java - 在 Switch 中使用来自资源 XML 的字符串?