如标题中所示。有很多类似的问题,但我将给出不同的示例:我有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()方法更易于遵循,并且不容易出现问题(忘记将最终的elseifelse if一起使用;使用赋值运算符=而不是等价运算符==;不小心使用了二进制按位AND &运算符,而不是二进制逻辑AND &&运算符,等等)。switch()方法的唯一潜在缺点是忘记在每种情况下都添加break语句,但是在这种情况下,您可以使用CppCheckenable -Wswitch-fallthrough 引起编译器警告或失败。
编辑

忘了提到在开关中总是有一个default大小写。我一直认为这是给定的。
因此,使用:

  • -Wswitch-default:强制在switch语句中使用默认情况。
  • 我已更正,但尚未实现-Wswitch-fallthrough。太糟糕了,因为clang已经有一段时间了。将CppCheck用作构建/质量检查流程的一部分,以避免被这种疏忽所困扰。
  • 09-07 05:05