【问题标题】:is switch case without break a bad practice?不中断的开关盒是一种不好的做法吗?
【发布时间】:2016-12-01 14:13:40
【问题描述】:

我有一个开关,我在其中检查某种属性,如果检查产生特定值,我想检查另一个值,所以我做了这样的事情:

switch(property_A)
{
case NA:
    if(value_0 == property_B)
        property_A = value_a;
    else if(value_1 == property_B)
        property_A = value_b;
case value_0:
...
break;
case value_1:
...
break;
}

所以,我知道这可以解决我的问题,但我不知道这是个好主意还是我应该以其他方式解决这个问题

# NA 情况类似于默认情况,但不完全是,因为它确实告诉了我一些事情,但还不够

【问题讨论】:

  • 如果您在执行NA 中的内容后尝试跳转到正确的大小写,它将不起作用。
  • 允许一个案例“失败”到下一个案例是很常见的。但是,您所做的并不是“检查另一个值”。如果您修改正在打开的值并希望从一开始就运行switch,您需要一个循环。
  • 如果你点击case NA,你想让case value_o中的代码执行吗?
  • 没有休息我只是去下一个案例,不管我的property_A值是什么?
  • 是的。这就是“失败”的意思,代码将继续。它“穿过”当前case 的底部并继续其下方的下一个。

标签: c switch-statement


【解决方案1】:

这取决于你想做什么。如果遇到NA 的情况,没有break 关键字,value_0 的情况将在两个if 分支之一完成后执行。因此,如果这是您想要的行为,可以不使用break,但我认为这不是您想要做的。

我建议您只需将 if - else 语句移到 switch 上方并删除 NA 大小写。这样,您将首先将正确的数据分配给property_A,然后您可以在switch 中对它做任何您想做的事情。

编辑:作为Jack Deethpoints out,如果您故意省略了break 语句,最好添加您这样做的评论。

【讨论】:

    【解决方案2】:

    约定是添加一条注释,明确告诉未来的你和任何其他维护者你打算放弃,并且你没有不小心遗漏了break;

    switch(foo) {
    case 1:
      bar();
      // fallthrough
    case 2:
      baz();
      break;
    case 3:
      fizzbuzz();
    }
    

    如果您使用的是 C++17 或更高版本,则可以使用 [[fallthrough]] 属性来避免编译器警告:

    switch(foo) {
    case 1:
      bar();
      [[fallthrough]]
    case 2:
      baz();
      break;
    case 3:
      fizzbuzz();
    }
    

    【讨论】:

    • 我确实添加了评论,但想知道即使有评论这是否是一种不好的做法
    【解决方案3】:

    问题的 cmets 中提供的附加信息表明,想要的不是问题中写的:

    switch(property_A)
    {
      case NA:
        if(value_0 == property_B)
            property_A = value_a;
        else if(value_1 == property_B)
            property_A = value_b;
        // here, we fallthrough into the code for value_0
        // but you want to switch on the new value instead
      case value_0:
        ...
        break;
    }
    

    你说你真正想要的是设置property_A,如果它最初是NA,然后跳转到正确的标签。在这种情况下,您需要在 switch 语句之外进行赋值。您可以在 NA 案例的末尾使用 goto 来执行此操作,但我建议您在切换之前只处理 NA

    if (property_A==NA)
        property_A = (value_0 == property_B) ? value_a
                   : (value_1 == property_B) ? value_b
                   : NA;
    
    switch (property_A) {
      case value_0:
        ...
        break;
      case NA:
        // we get here only if none of the replacement conditions
        // matched, outside the 'case'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多