切换案例没有打破不良做法?

时间:2016-12-01 14:13:40

标签: c switch-statement

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

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案例类似于默认情况但不完全正确,因为它确实告诉了我一些事情,但还不够

3 个答案:

答案 0 :(得分:4)

这取决于你想做什么。如果您在没有NA关键字的情况下进入案例break,则value_0案例将在两个if分支中的一个完成后执行。因此,如果这是您想要的行为,那么可以不使用break,但我不会认为您想要做的事情。

我建议您只需将if - else语句移到switch上方,然后删除NA个案。这样,您首先会将正确的数据分配给property_A,然后您可以在switch中随意执行任何操作。

编辑:如Jack Deeth points out,如果您故意省略break声明,最好添加您这样做的评论。

答案 1 :(得分:3)

惯例是添加一条评论,明确告诉将来你和你想要的任何其他维护者,你并没有意外地省略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();
}

答案 2 :(得分:2)

问题评论中提供的其他信息表明,所要求的并不是问题所写的内容:

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语句之外。您可以在goto案例结尾处使用NA执行此操作,但我建议您在切换之前处理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'
}