- Sentencias compuestas (bloques de código)
- Declaraciones y definiciones
- Sentencias simples (expresiones)
- Visión general de las sentencias de control
- Operador cíclico for
- Operador cíclico while
- Operador cíclico do
- Operador condicional if
- Operador switch
- Operador break
- Operador continue
- Operador return
- Sentencia vacía
Operador de selección switch
El operador switch permite elegir una de varias opciones de algoritmo. Por regla general, el número de opciones es significativamente superior a dos, ya que, de lo contrario, es más fácil utilizar la sentencia if/else. En teoría, la cadena de sentencias if/else permite tener un equivalente de switch en muchos casos (pero no en todos). Una característica importante de switch es que todas las opciones se seleccionan (identifican) en función del valor de la expresión entera, normalmente una variable.
En general, la sentencia switch tiene el siguiente aspecto:
switch ( expression )
|
El encabezado de la sentencia comienza con la palabra clave switch. Esta debe ir seguida de una expresión entre paréntesis y también se necesita el bloque con corchetes.
Los valores enteros que pueden obtenerse evaluando una expresión deben especificarse como constantes después de la palabra clave case. Una constante es un literal de cualquier tipo entero, como por ejemplo int (10, 123), ushort (caracteres 'A', 's', '*', etc.), o elementos enum. Aquí no se permiten números reales, variables ni expresiones.
Puede haber muchas de estas opciones case, o puede no haber ninguna, lo que se indica mediante corchetes semicirculares con el índice opt(n). Todas las variantes deben tener constantes únicas (sin repeticiones).
Para cada alternativa declarada con case debe escribirse una expresión después de los dos puntos, que se ejecutará si el valor de la expresión es igual a la constante correspondiente. De nuevo, una afirmación puede ser simple o compuesta. Además, es posible escribir varias sentencias simples sin encerrarlas entre llaves: seguirán ejecutándose como un grupo (sentencia compuesta).
Una o varias de estas sentencias pueden ir seguidas de la sentencia de salto break.
Si hay un break, después de ejecutar las sentencias anteriores de la rama case, la sentencia switch sale, es decir, el control se transfiere a las sentencias situadas por debajo de switch.
En ausencia de break, las sentencias de la rama siguiente o de varias ramas case continúan ejecutándose, es decir, hasta que se encuentra la primera break o el final del bloque switch. Esto se denomina «fall-through».
Así, la sentencia switch no sólo permite dividir el flujo de ejecución del algoritmo en varias alternativas, sino también combinarlas, algo que no está disponible para el operador if. Por otro lado, en la sentencia switch, a diferencia de if, no se puede seleccionar un rango de valores como condición para activar alternativas.
La palabra clave default permite establecer la variante del algoritmo por defecto, es decir, para cualesquiera otros valores de la expresión excepto para las constantes de todos los cases. La opción default puede no estar presente, o debe haber sólo una.
La secuencia en la que se enumeran las constantes case y default puede ser arbitraria.
Aunque todavía no exista algoritmo para la rama default, se recomienda hacerla explícitamente vacía, es decir, que contenga break. Un default vacío le recordará a usted y a otros programadores que existen otras opciones pero que no se consideran importantes, ya que, de lo contrario, la rama default tendría que señalar un error.
Varias variantes de case con diferentes constantes pueden enumerarse una debajo de otra (o de izquierda a derecha) sin sentencias, pero la última debe tener una sentencia. Estos cases combinados se indican en el diagrama con el índice (i).
He aquí el switch más fácil y más inútil:
switch(0)
|
Veamos un ejemplo más complejo con diferentes modos (StmtSelectionSwitch.mq5). En él, el operador switch se coloca dentro del bucle para mostrar cómo su trabajo depende de los valores de la variable de control i.
for(int i = 0; i < 7; i++)
|
La opción -1 fallará porque el bucle cambia la variable i de 0 a 6 (ambos inclusive). Cuando i sea 0, se activará la rama default. También tomará el control cuando i sea igual a 6. Todos los demás valores i posibles se distribuyen según las directivas correspondientes de case. Al mismo tiempo, no hay ninguna sentencia break después del caso 2, por lo que el código de las opciones 3 y 4 se ejecutará además del 2 (en estos casos, siempre se recomienda dejar un comentario indicando que se ha hecho intencionadamente).
Los casos 3 y 4 tienen un bloque de sentencias común. No obstante, también es importante señalar aquí que si desea declarar una variable local dentro de una de las opciones de case , debe encerrar las sentencias en un bloque compuesto anidado ('{...}'). Aquí, se define de esa manera la variable local_var.
Conviene advertir que en el caso default no hay sentencia break. Esto es redundante porque default se escribe en último lugar en este caso. Sin embargo, muchos programadores aconsejan insertar break al final de cualquier opción, incluso de la última, porque puede dejar de ser la última en el proceso de modificaciones posteriores del código, y entonces es fácil olvidarse de añadir break, lo que probablemente conducirá a un error en la lógica del programa.
Si en switch no hay default y la expresión del encabezado no coincide con ninguna de las constantes de case, se omite switch por completo.
Como resultado de la ejecución del script obtendremos los siguientes mensajes en el log:
Default: 0
|