如标题所示。有很多类似的问题,但我会给出不同的例子:我有2个枚举
enum A
{
A_ONE,
A_TWO
};
enum B
{
B_ONE,
B_TWO
};
通过枚举A进行更清晰的切换然后在所有情况下通过枚举B切换?
A type1;
B type2;
switch(type1)
{
case A_ONE:
switch(type2)
{
case B_ONE:
//statement1
break;
case B_TWO:
//statement2
break;
}
break;
case A_TWO:
switch(type2)
{
case B_ONE:
//statement3
break;
case B_TWO:
//statement4
break;
}
break;
}
或使用else if
if(type1 == A_ONE && type2 == B_ONE)
//statement1
else if(type1 == A_ONE && type2 == B_TWO)
//statement2
else if(type1 == A_TWO && type2 == B_ONE)
//statement3
else if(type1 == A_TWO && type2 == B_TWO)
//statement4
哪种做法更好?你有什么好处
答案 0 :(得分:3)
这更像是一种风格问题。如果您只检查有限数据集中是否存在两个条件,则switch()
方法更容易理解,并且不太容易出现问题(忘记最后else
与if
一起使用},else if
;使用赋值运算符=
而不是等价运算符==
;意外地使用二进制按位AND &
运算符而不是二进制逻辑AND {{1}运算符等)。
&&
方法的唯一潜在缺点是忘记在每种情况下放置switch()
语句,但您可以使用CppCheck或enable -Wswitch-fallthrough
来导致编译器警告或者在这种情况下失败。
忘记提及在交换机中始终有break
个案例。我总是认为这是给定的。
所以,请使用:
default
:强制切换语句中的默认情况。-Wswitch-default
尚未实施。太糟糕了,因为clang已经有一段时间了。使用CppCheck作为构建/质量保证流程的一部分,以避免受到这种疏忽的影响。答案 1 :(得分:1)
这取决于。 我认为这是品味,个人喜好或公司标准的问题。
在两个枚举文字的情况下, if-else 语句可能等同于 switch 语句。但随着文字数量的增加, if-else 语句可能变得不可维护或难以阅读,而 switch 语句可能有助于系统地涵盖所有案例。
此外,我建议考虑将default
案件用于解决异常情况。
答案 2 :(得分:1)
我建议你:
在你的例子中只有4个posibble组合,所以可以这样做,但想想例如:如果你的枚举A有10个元素,枚举B有6个,你需要60个else-if'语句涵盖所有可能性,以后当你尝试阅读它时可能会变得困难,相反,如果你使用'switch'你也需要60个声明,但稍后你会发现它更容易阅读或修改