2011-12-27 9 views
11

¿Puedo usar la caja del interruptor para verificar varias condiciones? como por ejemplo cualquiera de las condiciones cumplidas, ¿hará su caso?¿Múltiples condiciones en la caja del interruptor?

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

¿cuál sería la ventaja del * cambio * sobre un * * normal *? ¿Puedes dar un ejemplo de lo que harías si fuera posible? –

+0

Ok, de hecho, quiero que mi robot avance cuando se hace clic en los botones 1 o 2. Pero de alguna manera, los otros botones seguirán la dirección anterior previamente ejecutada. – user982209

Respuesta

14

No. En C++ cambiar caso sólo se puede utilizar para el control de los valores de una variable de la igualdad:

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

Pero se pueden utilizar múltiples conmutadores:

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

Obviamente, la cuestión de cómo ejecutar código si bien Estadoa o conditionB es true puede ser trivialmente respondió con if(conditionA || conditionB), sin switch comunicado necesario. Y si una declaración switch es, por alguna razón, un deber-tener, entonces la pregunta puede ser trivialmente respondida sugiriendo una etiqueta case fallida, como lo hace una de las otras respuestas.

No sé si las necesidades del OP están completamente cubiertas por estas respuestas triviales, pero esta pregunta será leída por muchas personas además del OP, por lo que me gustaría presentar una solución más general que pueda resolver muchas problemas para los cuales las respuestas triviales simplemente no sirven.

Cómo utilizar una sola declaración switch para verificar los valores de un número arbitrario de condiciones booleanas, todo al mismo tiempo.

Es hacky, pero puede ser útil.

El truco es convertir el valor true/false de cada una de sus condiciones para un poco, concatenar estos bits en un valor int, y luego switch en el valor int.

Aquí es un código de ejemplo:

#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. 
} 

A continuación, puede utilizar la etiqueta case caer a través de si tiene o esto o escenarios. Por ejemplo:

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

¿Qué pasa con la caída a través característica de la construcción interruptor/caso?

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

En respuesta a tu comentario: autorización I realmente quiero que mi robot se mueva hacia adelante cuando se hace clic en cualquiera de los botones 1 o 2. Pero de alguna manera, los otros botones seguirán la dirección anterior previamente ejecutada.

Puede simplemente juntar Y si se hace clic en el primer botón con si se hace clic en el segundo botón, luego utilice una sola caja de interruptor o una instrucción if.

Cuestiones relacionadas