2011-12-27 3 views
11

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

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

Каково было бы преимущество * переключателя * над нормальным * если *? можете ли вы привести пример того, что вы сделали бы с ним, если это было возможно? –

+0

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

ответ

14

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

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

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

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

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

.

8

насчет падения сквозной особенность конструкции 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; 
} 
2

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

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