Цикл while

Данный цикл описывается с помощью ключевого слова while. Он повторяет выполнение управляемых инструкций до тех пор, пока логическое выражение в его заголовке истинно.

while ( условие )
   тело цикла

Условие — произвольное выражение логического типа. Наличие условия обязательно. Если перед началом цикла условие равно false, цикл не выполнится ни разу.

В отличие от C++, MQL5 не поддерживает определение переменных в заголовке цикла while.

Переменные, включенные в условие, должны быть определены до цикла.

Тело цикла — это простая или составная инструкция.

Цикл while обычно применяется, когда количество повторов не определено. Так, пример с ежесекундным выводом счетчика компьютерного таймера может быть записан с помощью цикла while и проверкой флага остановки (вызовом функции IsStopped) следующим образом (StmtLoopsWhile.mq5):

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

Также цикл while удобен, когда условие окончания цикла можно совместить с модификацией переменных в одном выражении. Следующий цикл выполняется, пока переменная i не достигнет нуля (0 трактуется как false).

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

Однако в данном случае выражение в заголовке не является логическим (и неявным образом преобразуется в false или true), о чем компилятор выдает предупреждение. Желательно всегда составлять выражения с соблюдением ожидаемых (согласно правилам) характеристик. Здесь цикл правильнее записать так:

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

Цикл можно использовать и с простой инструкцией (без блока):

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

Заметьте, что простая инструкция завершается точкой с запятой. Здесь также демонстрируется, что изменение переменной, проверяемой в заголовке, производится внутри цикла.

При работе с циклами нужно с осторожностью использовать беззнаковые целые числа. Например, следующий цикл никогда не закончится, потому что его условие всегда истинно (в принципе, компилятор мог бы выдать в таких местах предупреждения, но не выдает). После нуля счетчик "превратится" в большое положительное число (UINT_MAX) и цикл продолжится.

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

С точки зрения пользователя MQL-программа зависнет (перестанет реагировать на команды), хотя будет по-прежнему потреблять ресурсы (процессор и память).

Циклы while допускают вложенность, как и остальные виды инструкций повторения.