Несколько условий в корпусе выключателя? - PullRequest
12 голосов
/ 27 декабря 2011

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

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

Ответы [ 4 ]

23 голосов
/ 27 декабря 2011

Очевидно, что на вопрос о том, как выполнить код, если условием 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.
}

.

16 голосов
/ 27 декабря 2011

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

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

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

switch (var1) {
    case value1_1:
        switch (var2) {
            /* ... */
        }
        break;
    /* ... */
}
8 голосов
/ 05 февраля 2014

А как насчет сквозной функции конструкции переключатель / корпус?

switch(condition){
    case case1:
        // do action for case1
        break;
    case case2:
    case case3:
        // do common action for cases 2 and 3
        break;
    default:
        break;
}
2 голосов
/ 09 марта 2015

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

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

...