Очевидно, что на вопрос о том, как выполнить код, если условием A или условием B является true
, можно тривиально ответить с помощью if( conditionA || conditionB )
, оператор switch
не требуется.И если утверждение switch
по какой-то причине является обязательным, то на вопрос можно снова ответить тривиально, предложив провалить метку case
, как это делает один из других ответов.
Я делаюНе знаю, полностью ли удовлетворены потребности ОП этими тривиальными ответами, но этот вопрос будут читать многие люди, помимо ОП, поэтому я хотел бы представить более общее решение, которое может решить многие подобные проблемы, для которых тривиальные ответы простоне будет делать.
Как использовать один оператор switch
для одновременной проверки значений произвольного числа логических условий.
Это хакерство, но может пригодиться.
Хитрость заключается в том, чтобы преобразовать значение true
/ false
каждого из ваших условий в бит, объединить эти биты вint
значение, а затем switch
на значение int
.
Вот пример кода:
#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.
}
.