Цикл while
Данный цикл описывается с помощью ключевого слова while. Он повторяет выполнение управляемых инструкций до тех пор, пока логическое выражение в его заголовке истинно.
while ( условие )
|
Условие — произвольное выражение логического типа. Наличие условия обязательно. Если перед началом цикла условие равно false, цикл не выполнится ни разу.
В отличие от C++, MQL5 не поддерживает определение переменных в заголовке цикла while.
Переменные, включенные в условие, должны быть определены до цикла.
Тело цикла — это простая или составная инструкция.
Цикл while обычно применяется, когда количество повторов не определено. Так, пример с ежесекундным выводом счетчика компьютерного таймера может быть записан с помощью цикла while и проверкой флага остановки (вызовом функции IsStopped) следующим образом (StmtLoopsWhile.mq5):
while(!IsStopped())
|
Также цикл while удобен, когда условие окончания цикла можно совместить с модификацией переменных в одном выражении. Следующий цикл выполняется, пока переменная i не достигнет нуля (0 трактуется как false).
int i = 5;
|
Однако в данном случае выражение в заголовке не является логическим (и неявным образом преобразуется в false или true), о чем компилятор выдает предупреждение. Желательно всегда составлять выражения с соблюдением ожидаемых (согласно правилам) характеристик. Здесь цикл правильнее записать так:
int i = 5;
|
Цикл можно использовать и с простой инструкцией (без блока):
while(i < 10)
|
Заметьте, что простая инструкция завершается точкой с запятой. Здесь также демонстрируется, что изменение переменной, проверяемой в заголовке, производится внутри цикла.
При работе с циклами нужно с осторожностью использовать беззнаковые целые числа. Например, следующий цикл никогда не закончится, потому что его условие всегда истинно (в принципе, компилятор мог бы выдать в таких местах предупреждения, но не выдает). После нуля счетчик "превратится" в большое положительное число (UINT_MAX) и цикл продолжится.
uint i = 5;
|
С точки зрения пользователя MQL-программа зависнет (перестанет реагировать на команды), хотя будет по-прежнему потреблять ресурсы (процессор и память).
Циклы while допускают вложенность, как и остальные виды инструкций повторения.