Справочная статья
Оператор CONTINUE
Часть прохода иногда не имеет смысла: данные не подходят под условие обработки, и остаток тела нужно пропустить, не прекращая цикл. CONTINUE передаёт управление к концу текущего прохода, после чего цикл обычным образом переходит к следующему. Форма выбирается по виду цикла — CONTINUE FOR, CONTINUE WHILE или CONTINUE DO.
Когда оператор применим
Оператор нужен, чтобы пропустить оставшиеся действия текущего прохода и перейти к проверке или изменению счётчика. Каждая форма требует охватывающего цикла названного вида; сама форма не имеет аргументов. Оператор может находиться внутри условия или обработки ошибок, вложенных в цикл.
Синтаксис
CONTINUE FORCONTINUE WHILECONTINUE 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 и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.