OB *_* OB 60 c c++ switch-statement conditional-statements
这个问题主要针对C/C++,但我猜其他语言也是相关的.
我无法理解为什么仍然使用switch/case而不是if/else if.在我看来,很像使用goto,并导致相同类型的混乱代码,而相同的结果可以使用if/else,如果是更有条理的方式.
不过,我经常看到这些块.找到它们的一个常见位置是在消息循环(WndProc ...)附近,而这些是它们引发最严重破坏的地方之一:变量在整个块中共享,即使不是主要的(也不是在里面初始化).必须特别注意不要放弃休息,等等......
就个人而言,我避免使用它们,我想知道我错过了什么?
它们比if/else更有效吗?它们是否继承传统?
qrd*_*rdl 160
总结我的初始帖子和评论 - switch
语句if
/ else
语句有几个优点:
更清洁的代码.代码具有多个链接if
/ else if ...
看起来凌乱且难以维护 - switch
提供更清晰的结构.
性能.对于密集case
值,编译器生成跳转表,用于稀疏 - 二进制搜索或if
/的序列else
,因此在最坏的情况下switch
与if
/ 一样快else
,但通常更快.虽然一些编译器可以类似地优化if
/ else
.
测试顺序无关紧要.为了加速一系列if
/ else
测试,需要首先考虑更多可能的案例.随着switch
/ case
程序员不需要考虑这个问题.
默认可以是任何地方.使用if
/ else
default case必须在最后 - 最后else
.In switch
- default
可以在任何地方,只要程序员发现它更合适.
常用代码.如果你需要为几种情况执行公共代码,你可能会省略break
并且执行将"落空" - 这是你用if
/ 无法实现的else
.(/* FALLTHROUGH */
对于这种情况,有一个很好的做法是对它进行特殊评论--Lint识别它并且没有抱怨,如果没有这个评论,它会抱怨,因为忘记是常见的错误break
).
感谢所有评论者.
Eri*_* H. 31
嗯,一个原因是清晰......
如果你有一个开关/案例,那么表达式不能改变....即
switch (foo[bar][baz]) {
case 'a':
...
break;
case 'b':
...
break;
}
Run Code Online (Sandbox Code Playgroud)
而使用if/else,如果你误写(或意图):
if (foo[bar][baz] == 'a') {
....
}
else if (foo[bar][baz+1] == 'b') {
....
}
Run Code Online (Sandbox Code Playgroud)
阅读你的代码的人会想知道"foo表达式应该是相同的",还是"为什么它们不同"?
Jos*_*son 11
还要记住,switch语句允许控制流继续,这允许您很好地组合条件,同时允许您为特定条件添加其他代码,例如在以下代码段中:
switch (dayOfWeek)
{
case MONDAY:
garfieldUnhappy = true;
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
weekDay = true;
break;
case SATURDAY:
weekendJustStarted = true;
case SUNDAY:
weekendDay = true;
break;
}
Run Code Online (Sandbox Code Playgroud)
if/else
在这里使用语句不会是好的.
if (dayOfWeek == MONDAY)
{
garfieldUnhappy = true;
}
if (dayOfWeek == SATURDAY)
{
weekendJustStarted = true;
}
if (dayOfWeek == MONDAY || dayOfWeek == TUESDAY || dayOfWeek == WEDNESDAY
|| dayOfWeek == THURSDAY || dayOfWeek == FRIDAY)
{
weekDay = true;
}
else if (dayOfWeek == SATURDAY || dayOfWeek == SUNDAY)
{
weekendDay = true;
}
Run Code Online (Sandbox Code Playgroud)
如果有很多情况,那么switch语句似乎更清晰.
当你有多个你想要相同行为的值时,这也很好 - 只使用落入单个实现的多个"case"语句比if(这个||那个|| someotherthing || ..)更容易阅读. .)
它可能还取决于您的语言 - 例如,某些语言切换仅适用于数字类型,因此当您使用枚举值,数字常量等时,它会为您节省一些输入...
If (day == DAYOFWEEK_MONDAY) {
//...
}
else if (day == DAYOFWEEK_TUESDAY) {
//...
}
//etc...
Run Code Online (Sandbox Code Playgroud)
或者稍微容易阅读......
switch (day) {
case DAYOFWEEK_MONDAY :
//...
case DAYOFWEEK_TUESDAY :
//...
//etc...
}
Run Code Online (Sandbox Code Playgroud)