- 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
Selección if
La sentencia if tiene varias formas. En el caso más sencillo, ejecuta la sentencia dependiente si la condición especificada es verdadera:
if ( condition )
|
Si la condición es falsa, la sentencia se omite y la ejecución salta inmediatamente al resto del algoritmo (sentencias posteriores, si las hay).
La sentencia puede ser simple o compuesta. Una condición es una expresión de tipo booleano o transformable.
La segunda forma le permite especificar dos ramas de acciones: no sólo para la condición verdadera (enunciado_A), sino también para la falsa (enunciado_B):
if ( condition )
|
Cualquiera de las sentencias controladas que se ejecute, el algoritmo continuará después siguiendo las sentencias por debajo de la sentencia if/else .
Por ejemplo, un script puede seguir una estrategia diferente según el marco temporal del gráfico en el que se coloque. Para ello, basta con analizar el valor devuelto por la función integrada Period. El valor es del tipo ENUM_TIMEFRAMES. Si es inferior a PERIOD_D1, significa trading a corto plazo; en caso contrario, trading a largo plazo (StmtSelectionIf.mq5).
if(Period() < PERIOD_D1)
|
Como sentencia de la rama else se permite especificar el siguiente operador if y, así, ordenarlos en una cadena de comprobaciones sucesivas. Por ejemplo, el siguiente fragmento cuenta el número de letras mayúsculas y símbolos de puntuación (más exactamente, letras no latinas) de una cadena.
string s = "Hello, " + Symbol();
|
El bucle se organiza a través de todos los caracteres de la cadena (la numeración empieza por 0) y la función StringLen devuelve la longitud de la cadena. El primer if comprueba cada carácter para ver si pertenece al rango de la 'A' a la 'Z' y, si tiene éxito, incrementa el contador de mayúsculas en 1. Si el carácter no pertenece a este rango se ejecuta el segundo if , en el que la condición de pertenencia al rango de letras minúsculas (s[i] >= 'a' && s[i] <= 'z') se invierte con '!'. En otras palabras: la condición significa que el carácter no se encuentra en el intervalo dado. Dadas dos comprobaciones consecutivas, si el carácter no es una letra mayúscula (else) y tampoco una letra minúscula (segundo if), podemos concluir que el carácter no es una letra del alfabeto latino. En este caso, incrementamos el contador punctuation .
Las mismas comprobaciones podrían redactarse de forma más detallada, con bloques "{...}" para mayor claridad.
int capital = 0, small = 0, punctuation = 0;
|
El uso de llaves ayuda a evitar errores lógicos asociados que pueden producirse cuando el programador sólo se guía por la sangría en el código. En concreto, el problema más común es el denominado else «colgante».
Cuando las sentencias if están anidadas, a veces hay menos ramas else que if. He aquí un ejemplo:
factor = 0.0;
|
La sangría indica a qué tipo de lógica se refería el programador: factor debe convertirse en +1 cuando mode es mayor que 20, permanecer igual a 0 cuando mode está entre 10 y 20, y cambiar a -1 en caso contrario (mode <= 10). Pero, ¿funcionará así el código?
En MQL5, se da por sentado que cada else hace referencia al if anterior más cercano (que no tiene un else). Como resultado, el compilador tratará las sentencias de la siguiente manera:
factor = 0.0;
|
Así, factor será -1 en el rango mode de 10 a 20, y 0 para mode <= 10. Lo más interesante es que el programa no produce ningún error formal, ni durante la compilación ni durante la ejecución. Y, sin embargo, no funciona correctamente.
Para eliminar esos sutiles problemas lógicos se permite la colocación de llaves.
if(mode > 10)
|
Para mantener la coherencia del diseño es conveniente utilizar bloques en todas las ramas de la sentencia si ya se ha requerido al menos un bloque en ella.
Cuando utilice el bucle para comprobar la igualdad, tenga en cuenta la posibilidad de que se produzca un error tipográfico al escribir un '=' en lugar de dos caracteres '=='. Esto convierte la comparación en una asignación, y el valor asignado se analiza como una condición lógica. Por ejemplo:
// should have been x == y + 1, which would give false and skip the if
|
El compilador producirá una advertencia «expresión no booleana».