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;

これは、両方の値が共有作業を必要とするが、そのうちの 1 つ (または複数) がさらに特定の作業を必要とする、より複雑なケースでも使用できます。

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

他の人が特定したように、はい、フォールスルーを使用して論理的に論理和することができます:

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;
}

2 番目の実装を選択した場合は、||物事を処理しているため、1 または 0 のいずれかが返されることに注意してください。場合によっては、それだけです。

于 2012-09-28T18:36:23.397 に答える
1

フォールスルーを使用してその効果を得ることができます:

case someenumvalue:
case someotherenumvalue :
    do some stuff
    break;

-- のcaseようなステートメントは、ブロックの終わりまたは.gotocaseswitchbreak

于 2012-09-28T18:17:11.200 に答える