我有一个开关,我检查某种属性,如果检查产生一个特定值,我想检查另一个值,所以我做了这样的事情:
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案例类似于默认情况但不完全正确,因为它确实告诉了我一些事情,但还不够
答案 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'
}