2010-01-19 17 views
5

Soy un estudiante de programación en mi segunda clase OOP, y tengo una pregunta simple que no he podido encontrar en Internet, si está disponible, me disculpo.¿Es posible hacer lo siguiente en una instrucción Switch - C++?

Mi pregunta es la siguiente:

¿Es posible tener condiciones booleanas en sentencias switch?

Ejemplo:

switch(userInputtedInt) 
{ 
    case >= someNum && <= someOtherNum 
    break; 
    // Is this possible? 
} 
+4

No. Y debe observar que si está utilizando interruptores, es casi seguro que no está haciendo programación orientada a objetos. –

+3

@Neil: por favor explique. ¿Deberíamos reemplazar todas las expresiones booleanas en un programa con una jerarquía de clases completa? – Coincoin

+0

No. Pero no deberíamos pretender que estamos haciendo OOP - estamos haciendo una programación de procedimiento (desafortunadamente no hay TLA interesante). –

Respuesta

11

No esto no es posible en C++. Las sentencias Switch solo admiten coincidencias simples de enteros. Si necesita una condición booleana compleja, entonces debería usar un if/else bloquear

+2

'Seleccionar caso' en VB es tan fácil en este caso ... –

0

/////////////// Nop

+0

En C++ no debería ser /////////////// ¿No? –

+0

/////////////// ¡Correcto! –

0

Esto no es posible. Lo más cercano que puede hacer, si los valores son razonablemente similares es

switch(userInputtedInt) 
{ 
    case someNum: 
    case someNum+1: 
    // ... 
    case someOtherNum: 
    break; 

} 
0

C++ no es compatible con eso.

Sin embargo, si no tienen que ver con la escritura de código portable, estándar algunos compiladores soportan esta sintaxis extendida:

switch(userInputtedInt) 
{ 
    case someNum...someOtherNum: 
    break; 
} 

Esos valores deben ser constantes.

+1

¿Qué compiladores admiten esa sintaxis? –

+0

Creo recordar que Metrowerks lo apoya. Quizás otros? Es, por supuesto, meramente taquigrafía para tipear varias etiquetas de casos adyacentes. –

7

No, esto es por lo general el alcance de la declaración if:

if ((userInputtedInt >= someNum) && (userInputtedInt <= someOtherNum)) { ... } 

Por supuesto, se puede incorporar eso en una declaración switch:

switch (x) { 
    case 1: 
     // handle 1 
     break; 
    default: 
     if ((x >= 2) && (x <= 20)) { ... } 
} 
+2

+1 para "ámbito". – markh44

3

no es posible directamente - un C o la instrucción de cambio de C++ requiere que cada caso sea una constante, no una expresión booleana. Si tiene rangos distribuidos uniformemente, a menudo puede obtener el mismo efecto usando la división de enteros. p.ej. si tiene entradas del 1 al 100, y quiere trabajar con 90-100 como un solo grupo, 80-89 como otro grupo, y así sucesivamente, puede dividir su entrada entre 10, y cada resultado representará un rango.

7

Como han dicho otros, no puede implementar este directamente ya que está tratando de hacerlo porque la sintaxis de C++ no lo permite. Pero se puede hacer esto:

switch(userInputtedInt) 
{ 
    // case 0-3 inclusve 
    case 0 : 
    case 1 : 
    case 2 : 
    case 3 : 
    // do something for cases 0, 1, 2 & 3 
    break; 

    case 4 : 
    case 5 : 
    // do something for cases 4 & 5 
    break; 
} 
+0

Esto es interesante, es un gran uso del soporte de C++ para la caída implícita. – Alex

+5

@Alex: en realidad, aunque esto es compatible con C++, he descubierto que, por lo general, es menos expresivo y menos útil de lo que crees al principio. Las sentencias de conmutación como esta tienden a hacerse enormes, lo que dificulta su lectura, mantenimiento y depuración. Normalmente usaré ifs antes de usar un interruptor como este. O mejor aún haré algo completamente diferente. –

0

Si te apetece el preprocesador se podría escribir una especie de macro que se expande automáticamente al número de declaración de caso necesario. Sin embargo, eso requeriría un archivo largo con casi todas las declaraciones de casos (por ejemplo: #define CASE0 case 0: #define CASE1 case 1: ...)

No debería ir allí, pero es divertido de hacer ... ¡por diversión! ;)

1

O quizá puede hacer esto

switch((userInputtedInt >= someNum) && (userInputtedInt <= someOtherNum)) 
{ 
case true: 
    //do something 
    break; 
case false: 
    //something else 
    break; 
} 

Pero eso es horrible programación simplemente abajo a la derecha que podría ser manejado con declaraciones if-else.

0

La norma no permite esto:

6.4.2 La sentencia switch [stmt.switch]

[...] Cualquier declaración en la instrucción switch puede marcarse con uno o más caso etiqueta como sigue:

case constant-expression :

donde la constante-expresión será una expresión constante integral (5.19).

0

Algunos compiladores de C++ aún admiten la sintaxis en la actualidad, 8 años después de que esta pregunta se realizó originalmente. Me sorprende.

Aprendí Pascal en 2012, Pascal tiene notaciones de rango. Luego, algo me animó a probar la sintaxis similar con C++, luego funciona inesperadamente fabuloso.

El compilador en mi portátil es g ++ (GCC) 6.4.0 (del proyecto Cygwin) std = C++ 17

Hay un ejemplo de trabajo, que escribí en la prisa. repl.it

Además, el código fuente está fijado de la siguiente manera:

#include <iostream> 
using namespace std; 
#define ok(x) cout << "It works in range(" << x << ")" << endl 
#define awry cout << "It does\'t work." << endl 

int main() { 
    /*bool a, b, c, d, e, f, g; 
    switch(true) { 
     case (a): break;   These does not work any more... 
     case (b and c): break; 
    }*/ 
    char ch1 = 'b'; 
    switch(ch1) { 
     case 'a' ... 'f': ok("a..f"); break; 
     case 'g' ... 'z': ok("g..z"); break; 
     default: awry; 
    } 
    int int1 = 10; 
    switch(int1) { 
     case 1 ... 10: ok("1..10"); break; 
     case 11 ... 20: ok("11..20"); break; 
     default: awry; 
    } 

    return 0; 
} 
Cuestiones relacionadas