私は次のようなことをしたい:
case someenumvalue || someotherenumvalue:
// do some stuff
break;
これはCで合法ですか?
スイッチをオンにしている変数は、列挙されたリスト データ構造体です。
私は次のようなことをしたい:
case someenumvalue || someotherenumvalue:
// do some stuff
break;
これはCで合法ですか?
スイッチをオンにしている変数は、列挙されたリスト データ構造体です。
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;
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
.. これは、特にデバッガーにアクセスできない状況で、過去に頭痛の種になりました。
必要なもの:
case someenumvalue:
case someotherenumvalue :
do some stuff
break;
他の人が特定したように、はい、フォールスルーを使用して論理的に論理和することができます:
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 のいずれかが返されることに注意してください。場合によっては、それだけです。
フォールスルーを使用してその効果を得ることができます:
case someenumvalue:
case someotherenumvalue :
do some stuff
break;
-- のcase
ようなステートメントは、ブロックの終わりまたは.goto
case
switch
break