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.
}
.
¿cuál sería la ventaja del * cambio * sobre un * * normal *? ¿Puedes dar un ejemplo de lo que harías si fuera posible? –
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