【问题标题】:Switch or else if statements - what is more clear in C++Switch 或 else if 语句 - 在 C++ 中更清楚的是什么
【发布时间】:2016-03-01 23:37:10
【问题描述】:

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

哪种做法更好?你喜欢什么

【问题讨论】:

  • 它们的用途不是同义词。 Switch 语句用于离散值已知并与之进行比较的情况; If 语句这样做,但也允许检查任何布尔表达式。有些事情你不能用 switch 语句来做,而你可以用 if 语句来做。
  • 旁注:在这两种情况下,您都应该将枚举值命名为 ONE 和 TWO。它们已经被 A 和 B 限定了。您无需在名称中重复。
  • 还有其他选择吗?由于合并 enum AB 这似乎相关,拆分为子功能(因此 2 switch (type2) 不会出现在 switch(type1)...
  • 我无法合并它。这只是示例,但在我的代码中,这两个枚举并不相关。
  • @EJP:我不同意。不仅在风格上,而且因为除非您将枚举本身放在不同的范围内,否则what you suggest is impossible。请记住,它们将被命名为 A_ONE 等,而不是 A::A_ONE 等。这很重要。

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


【解决方案1】:

这更多的是风格问题。如果您只检查有限数据集上是否存在两个条件,switch() 方法更容易遵循,并且不太容易出现问题(忘记最后的elseifelse if 一起使用;使用赋值运算符= 而不是等价运算符==;不小心使用二进制位与& 运算符而不是二进制逻辑与&& 运算符等)。

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

编辑


忘了提到开关中总是有default 的情况。我一直认为这是给定的。

所以,使用:

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

【讨论】:

【解决方案2】:

我建议你这样做:

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

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

【讨论】:

    【解决方案3】:

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

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

    另外我建议考虑把default case 覆盖到异常情况。

    【讨论】:

    • “我建议始终使用默认大小写来覆盖异常情况” 有时,但有时,如果您知道输入不是来自用户并且会始终是有效的枚举成员,如果您省略 default 情况,那么如果您添加到枚举但忘记添加到开关,您将收到编译器警告。与所有事情一样,应用思考和推理,而不是遵循一揽子规则。
    • 是的,我明白了。所以我改变了我的回答。
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多