切换或if语句 - 在C ++中更清楚

时间:2016-03-01 23:37:11

标签: c++ if-statement enums switch-statement

如标题所示。有很多类似的问题,但我会给出不同的例子:我有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

哪种做法更好?你有什么好处

3 个答案:

答案 0 :(得分:3)

这更像是一种风格问题。如果您只检查有限数据集中是否存在两个条件,则switch()方法更容易理解,并且不太容易出现问题(忘记最后elseif一起使用},else if;使用赋值运算符=而不是等价运算符==;意外地使用二进制按位AND &运算符而不是二进制逻辑AND {{1}运算符等)。

&&方法的唯一潜在缺点是忘记在每种情况下放置switch()语句,但您可以使用CppCheckenable -Wswitch-fallthrough来导致编译器警告或者在这种情况下失败。

修改

忘记提及在交换机中始终有break个案例。我总是认为这是给定的。

所以,请使用:

  • default:强制切换语句中的默认情况。
  • 我更正了,-Wswitch-default尚未实施。太糟糕了,因为clang已经有一段时间了。使用CppCheck作为构建/质量保证流程的一部分,以避免受到这种疏忽的影响。

答案 1 :(得分:1)

这取决于。 我认为这是品味,个人喜好或公司标准的问题。

在两个枚举文字的情况下, if-else 语句可能等同于 switch 语句。但随着文字数量的增加, if-else 语句可能变得不可维护或难以阅读,而 switch 语句可能有助于系统地涵盖所有案例。

此外,我建议考虑将default案件用于解决异常情况。

答案 2 :(得分:1)

我建议你:

  • 如果您评估的数据量较低,请使用'else-if'语句。
  • 当需要测试大量数据时,请使用“开关”。

在你的例子中只有4个posibble组合,所以可以这样做,但想想例如:如果你的枚举A有10个元素,枚举B有6个,你需要60个else-if'语句涵盖所有可能性,以后当你尝试阅读它时可能会变得困难,相反,如果你使用'switch'你也需要60个声明,但稍后你会发现它更容易阅读或修改