我想做类似的事情:
case someenumvalue || someotherenumvalue:
// do some stuff
break;
这在C中是合法的吗?
我正在进行切换的变量是枚举列表数据结构。
答案 0 :(得分:12)
您可以依赖case
语句在没有break
的情况下直播的事实:
case SOME_ENUM_VALUE: // fall-through
case SOME_OTHER_ENUM_VALUE:
doSomeStuff();
break;
您也可以在更复杂的情况下使用它,其中两个值都需要共享工作,但其中一个(或多个)还需要特定的工作:
case SOME_ENUM_VALUE:
doSpecificStuff();
// fall-through to shared code
case SOME_OTHER_ENUM_VALUE:
doStuffForBothValues();
break;
答案 1 :(得分:2)
是的,您可以跳过第一个break
中的case
来实现效果:
switch (expr) {
case someenumvalue: // no "break" here means fall-through semantic
case someotherenumvalue:
// do some stuff
break;
default:
// do some other stuff
break;
}
许多程序员忘记插入break
而无意中陷入了陷入困境的陷阱。这让我有些头疼,特别是在我无法访问调试器的情况下。
答案 2 :(得分:2)
你需要:
case someenumvalue:
case someotherenumvalue :
do some stuff
break;
答案 3 :(得分:1)
您可以使用fallthrough来达到效果:
case someenumvalue:
case someotherenumvalue :
do some stuff
break;
case
语句,如goto
- 您的程序将执行其后的所有内容(包括其他case
语句),直到您到达switch
块的末尾或break
。
答案 4 :(得分:1)
正如其他人所说的那样,是的,你可以通过使用堕落来逻辑地将事物组合在一起:
case someenumvalue: //case somenumvalue
case someotherenumvalue : //or case someothernumvalue
do some stuff
break;
但是要直接回答你的问题,是的,你可以对它们做一个逻辑的,或者按位的or
(这只是操作结果的一个例子),只要小心你是得到你所期望的:
enum
{
somenumvalue1 = 0,
somenumvalue2 = 1,
somenumvalue3 = 2
};
int main()
{
int val = somenumvalue2; //this is 1
switch(val) {
case somenumvalue1: //the case for 0
printf("1 %d\n", mval);
break;
case somenumvalue2 || somenumvalue3: //the case for (1||2) == (1), NOT the
printf("2 %d\n", mval); //case for "1" or "2"
break;
case somenumvalue3: //the case for 2
printf("3 %d\n", mval);
break;
}
return 0;
}
如果您选择执行第二次实施,请记住,既然您是||
'事物,那么您将获得1或0,就是这样。