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

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

Оператор CONTINUE

Часть прохода иногда не имеет смысла: данные не подходят под условие обработки, и остаток тела нужно пропустить, не прекращая цикл. CONTINUE передаёт управление к концу текущего прохода, после чего цикл обычным образом переходит к следующему. Форма выбирается по виду цикла — CONTINUE FOR, CONTINUE WHILE или CONTINUE DO.

Когда оператор применим

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

Синтаксис

CONTINUE FOR
CONTINUE WHILE
CONTINUE DO

Куда переходит каждая форма

ФормаДействие
CONTINUE FORПереходит к NEXT, изменяет счётчик и проверяет границу следующего прохода.
CONTINUE WHILEПереходит к условию в заголовке WHILE.
CONTINUE DOПереходит к предусмотренной формой DO проверке условия или к следующему проходу безусловного цикла.

Форма должна находиться внутри охватывающего цикла соответствующего вида, и переход всегда относится к ближайшему циклу этого вида, а не к самому внутреннему циклу вообще. При смешанном вложении `CONTINUE FOR` внутри `WHILE`, который сам находится в `FOR`, возвращает управление к объёмлющему `FOR`, а `CONTINUE WHILE` внутри `FOR`, вложенного в `WHILE`, возвращает к условию `WHILE`. Вложенные `TRY`/`FINALLY` при этом выполняются до перехода: блок `FINALLY` завершается, затем управление уходит к выбранному циклу. Аргументов у оператора нет. Выбор вида показан на примере: внутренний `WHILE` не доходит до своего конца, потому что каждый проход передаёт управление внешнему `FOR`.

DIM guard AS INTEGER
FOR i = 1 TO 3
    WHILE guard < 10
        guard = guard + 1
        CONTINUE FOR
    END WHILE
    PRINT "после WHILE"
NEXT i
PRINT guard

Результат:

3

Строка «после WHILE» не печатается: `CONTINUE FOR` покидает тело `WHILE` раньше, чем оно завершится, и счётчик `guard` увеличивается ровно три раза — по одному на проход внешнего цикла.

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

FOR index = 1 TO 5
    IF index MOD 2 = 0 THEN
        CONTINUE FOR
    END IF
    PRINT index
NEXT

Результат:

1
3
5

Для значений 2 и 4 управление ушло к NEXT до вывода, поэтому напечатаны только нечётные числа, а цикл прошёл все пять значений.

Изменение состояния

Продолжение не отменяет уже выполненные инструкции. Следите, чтобы нужное изменение состояния не оказалось после CONTINUE: для цикла с условием это может помешать завершению. В FOR изменение счётчика выполняется автоматически. Если CONTINUE FOR стоит внутри вложенного WHILE, переход уходит к условию внутреннего цикла, а не к счётчику внешнего:

FOR counter = 1 TO 2
    DIM count AS INTEGER = 0
    WHILE count < 2
        count = count + 1
        CONTINUE FOR
        PRINT "Не выполняется"
    END WHILE
    PRINT counter
NEXT

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

1
2

Строка после CONTINUE FOR не выполняется ни разу, потому что переход каждый раз возвращает к проверке условия WHILE; счётчик внешнего цикла меняется только на NEXT, и внешний цикл проходит оба своих значения.

Диагностика

  • MB2037 — CONTINUE FOR используется вне цикла FOR ... NEXT.
  • MB2038 — CONTINUE WHILE используется вне цикла WHILE ... END WHILE.
  • MB2039 — CONTINUE DO используется вне цикла DO ... LOOP.

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

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

См. также