Operador cíclico while

Este bucle se describe utilizando la palabra clave while. Repite la ejecución de las sentencias controladas en tanto la expresión lógica de su encabezado sea verdadera.

while ( condition )
  loop body

La condición es una expresión arbitraria de tipo booleano. La presencia de la condición es obligatoria. Si la condición es false antes del inicio del bucle, éste nunca se ejecutará.

A diferencia de C++, MQL5 no admite la definición de variables en el encabezado del bucle while .

Las variables incluidas en la condición deben definirse antes del bucle.

El cuerpo del bucle es una sentencia simple o compuesta.

El bucle while suele utilizarse cuando el número de iteraciones no está definido. Así, un ejemplo con el bucle que da un contador de tiempo de ordenador cada segundo se puede escribir utilizando un bucle while y comprobando la bandera de parada (llamando a la función IsStopped ) de la siguiente manera (StmtLoopsWhile.mq5):

while(!IsStopped())
{
   Comment(GetTickCount());
   Sleep(1000);
}
Comment("");

Además, el bucle while es conveniente cuando la condición de finalización del bucle puede combinarse con la modificación de variables en una expresión. El siguiente bucle se ejecuta hasta que la variable i llega a cero (0 se trata como false).

int i = 5;
while(--i// warning: expression not boolean
{
   Print(i);
}

Sin embargo, en este caso, la expresión del encabezado no es booleana (y se convierte implícitamente a false o true). El compilador genera la advertencia correspondiente. Es conveniente componer siempre las expresiones teniendo en cuenta las características esperadas (según las normas). A continuación se muestra la versión correcta del bucle:

int i = 5;
while(--i > 0)
{
   Print(i);
}

El bucle también puede utilizarse con una sentencia simple (sin bloque):

while(i < 10)
   Print(++i);

Tenga en cuenta que una sentencia simple termina con punto y coma. También demuestra que el cambio de la variable que se comprueba en el encabezado se realiza dentro del bucle.

Cuando trabaje con bucles, tenga cuidado al utilizar enteros sin signo. Por ejemplo, el bucle siguiente no terminará nunca, porque su condición siempre es verdadera (en teoría, el compilador podría emitir avisos en esos lugares, pero no lo hace). Después de cero, el contador se «convertirá» en un número positivo grande (UINT_MAX) y el bucle continuará.

uint i = 5;
while(--i >= 0)
{
   Print(i);
}

Desde el punto de vista del usuario, el programa MQL se congelará (dejará de responder a los comandos), aunque seguirá consumiendo recursos (procesador y memoria).

while puede anidarse como otros tipos de sentencias de repetición.