Axiom Справочник языка

Справочная статья

Оператор DO … LOOP

Место проверки условия иногда важнее самого условия: блок может требовать хотя бы одного выполнения или, наоборот, не выполняться при ложном условии вовсе. DO … LOOP позволяет выбрать, где стоит проверка — в начале, в конце или нигде, — и как она читается: WHILE продолжает повторение при истинном условии, UNTIL завершает его при истинном.

Когда нужен DO … LOOP

Оператор DO позволяет повторять действия до изменения состояния данных. Цикл работает в консольной и графической программе, на верхнем уровне и внутри подпрограммы; специальный графический режим ему не нужен.

Если записано только одно условие, условие в заголовке проверяется до первого прохода. Условие после LOOP проверяется после тела, поэтому тело выполняется минимум один раз. Форма без условия повторяется до явного выхода или остановки программы. Выбор между этими вариантами и определяет, где именно окажется проверка.

Синтаксис

DO WHILE <условие>
    ⟦<инструкции>⟧
LOOP
DO UNTIL <условие>
    ⟦<инструкции>⟧
LOOP
DO
    ⟦<инструкции>⟧
LOOP WHILE <условие>
DO
    ⟦<инструкции>⟧
LOOP UNTIL <условие>
DO
    ⟦<инструкции>⟧
LOOP

Тело, продолжение и выход

Условие — выражение типа BOOLEAN, определяющее продолжение или завершение повторений. Инструкции обозначают ноль или несколько операторов тела. Между DO и LOOP находится тело. EXIT DO немедленно завершает ближайший цикл этого вида.

CONTINUE DO пропускает остаток текущего тела. При единственном условии после LOOP проверяется это условие; при единственном условии после DO проверяется заголовок следующего прохода. Без условия начинается следующий проход.

Проверка в конце гарантирует хотя бы один проход даже при ложном условии. В следующем примере счётчик увеличивается в теле, а цикл заканчивается, когда он достиг трёх:

DIM count AS INTEGER = 0
DO
    PRINT count
    count = count + 1
LOOP UNTIL count = 3

Результат:

0
1
2

Ноль попал в вывод до первой проверки: условие после LOOP оценивается только после тела. Когда счётчик стал равен трём, условие UNTIL выполнилось и повторение прекратилось.

Условия в заголовке и после LOOP

Разбор допускает условие после DO и условие после LOOP одновременно. В этом сочетании выполняется проверка выражения и вида WHILE или UNTIL из заголовка DO, но проверка происходит после тела из-за наличия условия после LOOP. Выражение после LOOP при исполнении не вычисляется; его тип всё равно проверяется компилятором. Оба условия не объединяются. Чтобы место проверки было однозначно видно из программы, используйте одну из пяти форм с единственным условием или без условия, показанных выше. Допустимые сочетания записываются так:

DO WHILE <условие заголовка>
    ⟦<инструкции>⟧
LOOP WHILE <условие окончания>
DO WHILE <условие заголовка>
    ⟦<инструкции>⟧
LOOP UNTIL <условие окончания>
DO UNTIL <условие заголовка>
    ⟦<инструкции>⟧
LOOP WHILE <условие окончания>
DO UNTIL <условие заголовка>
    ⟦<инструкции>⟧
LOOP UNTIL <условие окончания>

В следующем примере заголовок задаёт DO WHILE count < 2, но проверка выполняется после тела, а выражение TRUE после LOOP при исполнении не вычисляется:

DIM count AS INTEGER = 0
DO WHILE count < 2
    count = count + 1
    PRINT count
LOOP UNTIL TRUE

Ожидаемый вывод:

1
2

Диагностика

Условие не типа BOOLEAN даёт MB2008, отсутствие требуемого окончания блока — MB1001. Ошибкой является и EXIT DO, записанный вне цикла DO ... LOOP.

  • MB2014 — EXIT DO используется вне цикла DO ... LOOP.
  • MB2039 — CONTINUE DO используется вне цикла DO ... LOOP.

Запускаемые примеры

Откройте нужный файл в IDE и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.

См. также