如标题中所示。有很多类似的问题,但我将给出不同的示例:我有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;
}
或使用其他如果
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
哪个更好的做法?你喜欢什么
最佳答案
最重要的是样式问题。如果仅检查有限数据集上是否存在两个条件,则switch()
方法更易于遵循,并且不容易出现问题(忘记将最终的else
与if
和else if
一起使用;使用赋值运算符=
而不是等价运算符==
;不小心使用了二进制按位AND &
运算符,而不是二进制逻辑AND &&
运算符,等等)。switch()
方法的唯一潜在缺点是忘记在每种情况下都添加break
语句,但是在这种情况下,您可以使用CppCheck或enable -Wswitch-fallthrough
引起编译器警告或失败。
编辑
忘了提到在开关中总是有一个default
大小写。我一直认为这是给定的。
因此,使用:
-Wswitch-default
:强制在switch语句中使用默认情况。 -Wswitch-fallthrough
。太糟糕了,因为clang已经有一段时间了。将CppCheck用作构建/质量检查流程的一部分,以避免被这种疏忽所困扰。