- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这个问题主要针对 C/C++,但我猜其他语言也有关系。
我不明白为什么仍然使用 switch/case 而不是 if/else if。在我看来,这很像使用 goto,并导致相同类型的困惑代码,而使用 if/else if 可以以更有条理的方式实现相同的结果。
不过,我还是经常看到这些街区。找到它们的常见位置是在消息循环(WndProc...)附近,而这些是它们引发最严重破坏的地方之一:变量在整个 block 中共享,即使不合适(并且不能在里面初始化)。必须特别注意不要放弃休息,等等......
就我个人而言,我避免使用它们,我想知道我是否遗漏了什么?
它们是否比 if/else 更有效?它们是按照传统进行的吗?
最佳答案
总结我最初的帖子和评论 - switch
语句优于 if
/else
语句有几个优点:
更简洁的代码。具有多个链式 if
/else if ...
的代码看起来很凌乱且难以维护 - switch
提供更清晰的结构。
性能。对于密集的 case
值,编译器生成跳转表,对于稀疏 - 二分查找或一系列 if
/else
,所以在最坏的情况下 switch
与 if
/else
一样快,但通常更快。虽然有些编译器可以类似地优化 if
/else
.
测试顺序无关紧要。为了加快一系列 if
/else
测试,需要首先放置更多可能的案例。有了switch
/case
,程序员就不需要考虑这个了。
默认值可以是任何地方。 if
/else
的默认大小写必须在最后 - 在最后一个 else
之后。在 switch
- default
可以在任何地方,只要程序员认为它更合适。
通用代码。如果您需要在几种情况下执行通用代码,您可以省略 break
并且执行将“失败” - 这是您无法使用 if
/else
。 (对于这种情况,放置一个特殊的注释 /* FALLTHROUGH */
是一个很好的做法 - lint 识别它并且不会提示,如果没有这个注释它会提示,因为它是忘记的常见错误 中断
)。
感谢所有评论者。
关于c++ - 为什么切换/Case 而不是 If/Else If?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1028437/
我是一名优秀的程序员,十分优秀!