在开关盒内打开其他分支好吗?

时间:2014-04-05 22:41:32

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

我的代码意外地以下面的结构结束。我不确定这是否正常。

switch (msg.type)
{
  case Msg::Type::One:
  case Msg::Type::Two:
    // do nothing
    break;

  case Msg::Type::Open:
    if (msg.isBad())
      break;
    else // opened else branch is ok here??
    // intended fall through

   case Msg::Type::Close:
     goodMsg.push_back(msg);
     doSomethingOther();
     blaBla();
     break;
}

4 个答案:

答案 0 :(得分:4)

它可能有用,但是如果你打算通过,我会完全删除其他人,并留下评论,这是故意的堕落。

答案 1 :(得分:1)

if语句的语法是:

if (expression) statement

if (expression) statement else statement

在您的代码中,与else关键字相关联的语句整个switch语句 goodMsg.push_back(msg);(发生的情况)有一个与之关联的案例标签)。

我无法从您的问题中说出这是否符合您的意图,但您的缩进表明您认为switch声明独立于if / {{ 1}}。

如果这是您的意图,else无效。您的逻辑将更清楚地表达为:

else

我的建议:总是对条件语句和循环语句使用花括号。这样您就可以避免首先提出这样的问题:

if (condition) break;
case ...

if (condition) { statement } else { statement } / if / ... / else if链是一个特例。从语法上讲,它是一组嵌套的else / if语句,但它的惯例是将其视为一个线性链,写作:

else

而不是:

if (condition) {
    statement
}
else if (condition) {
    statement
}
else {
    statement
}

请注意,我使用K& R风格的大括号放置,每行if (condition) { statement } else { if (condition) { statement } else { statement } } 位于一行的末尾。另一种非常常见的样式将{{放在行上。两种选择都是有效的(我显然有自己的偏好),只要你一致

答案 2 :(得分:1)

我建议反对。在编码时,每个人都应遵循三点重要性层次:

  1. 可读性
  2. 功能
  3. 效率
  4. 我认为你在这里尝试做的是尝试通过减少编写的代码量使其更具可读性,但问题是它实际上正好相反。

    尝试提出另一种方法来完成您想要实现的目标,这对于完全陌生的人来说更容易理解。

    一个建议就是取消空的其他内容,只需要if语句。虽然这可能仍然不是最佳的可读性,但它比使用else语句更好,并且实际上可以在工作场所容忍。

答案 3 :(得分:1)

让我们标记代码的某些区域:

switch (msg.type) {
  case Msg::Type::One:
  case Msg::Type::Two:
    // (1)
    break;

  case Msg::Type::Open:
    if (msg.isBad()) {
      // (2)
      break;
    } else {
      // (3)
      // intended fall through
    }

   case Msg::Type::Close:
     // (4)
     goodMsg.push_back(msg);
     doSomethingOther();
     blaBla();
     break;
}

这里有一个表格,显示将运行的代码:

                         (1) (2) (3) (4)
Msg::Type::One            ✔︎
Msg::Type::Two            ✔︎
Msg::Type::Open && Bad        ✔︎       
Msg::Type::Open && !Bad           ✔︎   ✔︎
Msg::Type::Close                      ✔︎

话虽这么说,但是这段代码的大多数读者会认为通过条件是一个错误。因此,我强烈建议重构此代码。