4

我想做类似的事情:

case someenumvalue || someotherenumvalue:
    // do some stuff
    break;

这在C中合法吗?

我正在打开的变量是一个枚举列表数据结构。

4

5 回答 5

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;
于 2012-09-28T18:17:00.663 回答
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. 这在过去让我有些头疼,尤其是在我无法访问调试器的情况下。

于 2012-09-28T18:17:12.507 回答
2

你需要:

case someenumvalue:
case someotherenumvalue :
    do some stuff
    break;
于 2012-09-28T18:17:26.110 回答
1

您可以使用fallthrough来获得这种效果:

case someenumvalue:
case someotherenumvalue :
    do some stuff
    break;

像 a 这样的case语句goto- 您的程序将执行它之后的所有内容(包括其他case语句),直到您到达switch块的末尾或break.

于 2012-09-28T18:17:11.200 回答
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,仅此而已。

于 2012-09-28T18:36:23.397 回答