Несколько условий в корпусе переключателя?

Можно ли использовать чехол для проверки нескольких условий? например, например, либо из выполняемого условия, это сделает его дело?

switch (conditionA or conditionB fullfilled)
  { //execute code }

Ответ 1

Нет. В С++ случае коммутатора можно использовать только для проверки значений одной переменной для равенства:

switch (var) {
    case value1: /* ... */ break;
    case value2: /* ... */ break;
    /* ... */
}

Но вы можете использовать несколько переключателей:

switch (var1) {
    case value1_1:
        switch (var2) {
            /* ... */
        }
        break;
    /* ... */
}

Ответ 2

Очевидно, что вопрос о том, как выполнить код, если какое-либо условие A или conditionB равен true, может быть тривиально ответил с помощью инструкции if( conditionA || conditionB ), no 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.
}

.

Ответ 3

Как насчет сквозной функции конструкции switch/case?

switch(condition){
    case case1:
        // do action for case1
        break;
    case case2:
    case case3:
        // do common action for cases 2 and 3
        break;
    default:
        break;
}

Ответ 4

В ответ на ваш комментарий: Хорошо, я действительно хочу, чтобы мой робот двигался вперед, когда нажата кнопка 1 или 2. Но каким-то образом другие кнопки будут следовать за предыдущим ранее выполнением.

Вы могли бы просто И вместе, нажата ли первая кнопка, нажата ли вторая кнопка, а затем используйте один ключ коммутатора или оператор if.