2010-01-24 17 views
5

simplemente no entiendo cómo utilizar un operador booleano dentro de una sentencia switch¿Cómo uso un operador booleano en una declaración de caso?

switch (expression) { 
     case > 20: 
      statements 
      break; 
     case < -20: 
      statements 
      break; 
    } 

Editar:
no quiero una instrucción If().

+0

sin comportamiento cuando 'expression == 20'? –

+0

No, solo porque las declaraciones de casos son más fáciles de leer y son más rápidas que las declaraciones If(). No quiero ningún comportamiento cuando 'expression == 20'. – Jaba

+1

Son más rápidos porque son menos poderosos. Tienes que comparar contra valores fijos, uno a la vez. No puede expresar lo que ha mostrado utilizando una declaración 'switch'. – zneak

Respuesta

5
switch ((expression) > 20) { 
     case true: 
      statements 
      break; 
     case false: 
     default: 
      statements 
      break; 
    } 

¿Qué ... quiere más de 1 booleano en un caso? Usted puede hacer esto

int ii = ((expression) > 20) + 2 * ((expression) < -20); 
switch (ii) { 
     case 1: 
      statements 
      break; 
     case 2: 
      statements 
      break; 
    } 

Esto, en mi opinión es bastante mal código, pero es lo que pediste ...

sólo tiene que utilizar la sentencia if, que va a estar mejor en el largo plazo.

+0

Me gustaría recordar que es principalmente la comparación lo que hace 'if' más lento que' cambiar'es, y en consecuencia esto no ayudará a que su código vaya más rápido. – zneak

+0

en realidad eso no es verdad. es la SUCURSAL que causa la desaceleración, no la comparación. Pero un cambio sigue siendo una rama. –

+0

Llego un año tarde, pero en caso de que alguien se tropiece con esta respuesta, lo que quise decir es que mientras tanto 'si' y' switch' causan una rama (y esta es la parte más lenta), ¿qué hace 'if/else if 'pares más lentos que una instrucción' switch' es que realizan una comparación por condición. Por otro lado, un 'interruptor' generalmente se implementa usando trucos ingeniosos que permiten evitar las comparaciones por completo, sin importar cuántos 'casos 'tenga. – zneak

10

No puede. Use if() ... else ....

Lo más cercano disponible a lo que desee utiliza una extensión GCC y, por lo tanto, no es estándar. Se pueden definir rangos en las declaraciones de casos en lugar de sólo un valor:

switch(foo) 
{ 
    case 0 ... 20: // matches when foo is inclusively comprised within 0 and 20 
     // do cool stuff 
     break; 
} 

Sin embargo, no se puede utilizar eso para que coincida con nada debajo de un cierto valor. Tiene que estar en un rango preciso. Switch es solo se puede usar para reemplazar el operador de comparación por una constante, y no se puede usar para nada más que eso.

+0

Desafortunadamente, la velocidad tiene el costo de la flexibilidad, y no hay forma de evitar el uso de un operador booleano en lugar de un interruptor. Es más rápido porque la CPU tiene menos trabajo que hacer en él. Si pudieras usar un operador booleano dentro de un 'switch', no habría ninguna razón por la cual las declaraciones' if' serían más lentas que las declaraciones 'switch'. – zneak

+0

¿Qué sucede cuando tengo más de 5 casos como así? – Jaba

+0

Bueno, es solo mi regla de oro, y no tenía la intención de hacer que pareciera una regla tan absoluta. Haz lo que quieras en ese caso. Voy a editar eso. – zneak

Cuestiones relacionadas