switch case を使って、複数の条件をチェックすることはできますか? 例えば、どちらかの条件が満たされれば、そのケースを実行するというように?
switch (conditionA or conditionB fullfilled)
{ //execute code }
明らかに、条件Aと条件Bのどちらかがtrue
の場合、どのようにコードを実行するかという質問には、 if( conditionA || conditionB )
と答えることができ、switch
文は必要ないでしょう。 そして、もし switch
文が何らかの理由で必須であるならば、他の答えのように case
ラベルのフォールスルー(通過)を提案することで、この質問にはまたしても自明な答えが得られるでしょう。
OPのニーズがこれらの些細な回答で完全にカバーされているかどうかは分かりませんが、この質問はOP以外の多くの人が読むでしょうから、些細な回答では解決できない多くの類似の問題を解決できる、より一般的な解決策を提示したいと思います'します。
***スイッチ文を使って、任意の数のブーリアン条件を同時にチェックする方法です。
ハチャメチャですが、重宝するかもしれません。
そのコツは、各条件の true
/false
値をビットに変換し、そのビットを int
値に連結し、その int
値で switch
を行うことです。
以下はコード例です。
#define A_BIT (1 << 0)
#define B_BIT (1 << 1)
#define C_BIT (1 << 2)
switch( (conditionA? A_BIT : 0) | (conditionB? B_BIT : 0) | (conditionC? C_BIT : 0) )
{
case 0: //none of the conditions holds true.
case A_BIT: //condition A is true, everything else is false.
case B_BIT: //condition B is true, everything else is false.
case A_BIT + B_BIT: //conditions A and B are true, C is false.
case C_BIT: //condition C is true, everything else is false.
case A_BIT + C_BIT: //conditions A and C are true, B is false.
case B_BIT + C_BIT: //conditions B and C are true, A is false.
case A_BIT + B_BIT + C_BIT: //all conditions are true.
default: assert( FALSE ); //something went wrong with the bits.
}
そして、どちらか一方のシナリオがある場合には、case
ラベルでフォールスルーすることができます。 例えば
switch( (conditionA? A_BIT : 0) | (conditionB? B_BIT : 0) | (conditionC? C_BIT : 0) )
{
case 0:
//none of the conditions is true.
break;
case A_BIT:
case B_BIT:
case A_BIT + B_BIT:
//(either conditionA or conditionB is true,) and conditionC is false.
break;
case C_BIT:
//condition C is true, everything else is false.
break;
case A_BIT + C_BIT:
case B_BIT + C_BIT:
case A_BIT + B_BIT + C_BIT:
//(either conditionA or conditionB is true,) and conditionC is true.
break;
default: assert( FALSE ); //something went wrong with the bits.
}
.
c++では、switch caseは1つの変数の値が等しいかどうかをチェックするためにのみ使用することができます。
switch (var) {
case value1: /* ... */ break;
case value2: /* ... */ break;
/* ... */
}
しかし、複数のスイッチを使用することができます。
switch (var1) {
case value1_1:
switch (var2) {
/* ... */
}
break;
/* ... */
}