Очевидно, что вопрос о том, как выполнить код, если либо conditionA или conditionB является true
может быть тривиальным ответил if(conditionA || conditionB)
, не switch
заявления необходимо. И если заявление switch
по какой-то причине является обязательным, то вопрос может быть снова тривиально удовлетворен, предлагая пропустить ярлык case
, как это делает один из других ответов.
Я не знаю, полностью ли удовлетворены потребности ОП в этих тривиальных ответах, но этот вопрос будет прочитан многими людьми, кроме OP, поэтому я хотел бы представить более общее решение, которое может решить многие аналогичные проблемы, для которых тривиальные ответы просто не будут делать.
Как использовать одиночный оператор 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.
}
.
Каково было бы преимущество * переключателя * над нормальным * если *? можете ли вы привести пример того, что вы сделали бы с ним, если это было возможно? –
Хорошо, я действительно хочу, чтобы мой робот двигался вперед, когда нажата кнопка 1 или 2. Но каким-то образом другие кнопки будут просто следовать предыдущему направлению, ранее выполненному. – user982209