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

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

Оператор FOR … NEXT

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

Когда нужен счётный цикл

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

Синтаксис

FOR <счётчик> = <начало> TO <конец> ⟦STEP <шаг>⟧
    ⟦<инструкции>⟧
NEXT ⟦<имя счётчика>⟧

Обход массива: FOR EACH

Когда нужен не числовой диапазон, а каждый элемент массива, применяется форма обхода:

FOR EACH ⟦BYVAL | BYREF⟧ <переменная> ⟦AS <тип>⟧ IN <массив>[]
    ⟦<инструкции>⟧
NEXT ⟦<имя переменной>⟧

`EACH` и `IN` — зарезервированные слова языка, поэтому их нельзя использовать как имена. Отсутствие модификатора означает `BYVAL`; на этом шаге реализован только этот режим. Тип переменной выводится из типа элементов массива; `AS` задаёт тип явно и допускает только расширяющее преобразование. Переменная создаётся циклом и доступна только внутри него.

Источник вычисляется один раз, поэтому вызов функции в заголовке выполняется однократно. Обход учитывает фактические границы, включая отрицательные, и обходит многомерный массив целиком: последнее измерение изменяется быстрее остальных. Выделенный пустой массив даёт ноль проходов, невыделенный сообщает MB3005.

В режиме `BYVAL` переменная цикла получает копию элемента: присваивание ей не изменяет исходный массив, а изменяемые значения внутри записи подчиняются обычным правилам общих ссылок. `EXIT FOR` завершает обход, `CONTINUE FOR` переходит к следующему элементу.

DIM fruits[] AS STRING = ["яблоко", "банан", "апельсин"]
FOR EACH fruit IN fruits[]
    PRINT fruit
NEXT fruit

Программа выводит три названия по одному в строке. Подробные правила обхода, границ и диагностик приведены в статье Обход массива FOR EACH.

Границы и шаг

Счётчик — новое имя изменяемой переменной, создаваемой циклом. Начало задаёт первое значение счётчика; конец задаёт включительную границу; шаг задаёт прибавляемую величину после каждого прохода. Инструкции в теле выполняются для каждого допустимого значения. Имя после NEXT можно опустить. Если оно указано, оно должно совпадать с именем счётчика закрываемого цикла без учёта регистра.

Начало, конец и шаг должны быть числовыми выражениями типов INTEGER, LONG или DOUBLE. Тип счётчика определяется по этим выражениям: при наличии DOUBLE выбирается DOUBLE, иначе при наличии LONG — LONG, иначе INTEGER. Тип DECIMAL для счётного цикла не поддержан. Явный тип в заголовке цикла не указывается.

Начальное значение, конечная граница и шаг вычисляются при входе в цикл. Если STEP отсутствует, шаг равен единице. Положительный шаг ведёт к увеличению счётчика, отрицательный — к уменьшению.

Обе границы включительны. При положительном шаге проходы выполняются, пока счётчик не превысил конец; при отрицательном — пока не стал меньше конца. Если начальное значение уже находится за границей в направлении шага, тело не выполняется. Нулевой шаг вызывает MB3004. Шаг два проходит только нечётные значения диапазона:

FOR index = 1 TO 5 STEP 2
    PRINT index
NEXT

Результат:

1
3
5

После прохода со значением 5 следующее значение вышло за включительную границу, и цикл завершился; поэтому число 5 напечатано, а следующего нечётного значения в выводе нет.

Счётчик, NEXT и вложенные циклы

После NEXT разрешено не более одного имени. Затем должен идти конец строки или конец файла; комментарий после имени допустим. Лишние слова, числа или инструкции на той же строке вызывают синтаксическую ошибку MB1004.

Наличие имени не меняет выбора завершаемого цикла: заканчивается ближайший открытый FOR. Имя после NEXT проверяется на совпадение со счётчиком этого цикла. Имя внешнего счётчика не может закрыть внутренний цикл. Например, при вложенном FOR innerIndex запись NEXT outerIndex вызывает ошибку MB2048.

Заранее объявлять счётчик не нужно. Его имя не должно совпадать с доступным именем переменной, константы, параметра или внешнего счётчика. Для вложенных циклов выбирайте разные имена.

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

Изменение хода цикла

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

Диагностика

  • MB2009 — начало, конец или шаг не позволяют выбрать допустимый тип счётчика либо имя занято переменной, которая имеет тип, который нельзя использовать в FOR.
  • MB2016 — имя счётчика уже занято во внешней области (DIM, CONST, параметр, внешний цикл): счётчик FOR всегда локальный.
  • MB2048 — имя после NEXT не совпадает со счётчиком закрываемого FOR.
  • MB1004 — после NEXT и необязательного имени записан лишний токен в той же строке.
  • MB3004 — шаг цикла равен нулю.
  • MB2013 — EXIT FOR используется вне цикла FOR ... NEXT.
  • MB2037 — CONTINUE FOR используется вне цикла FOR ... NEXT.
  • MB2001 — счётчик, созданный самой строкой FOR, используется после выхода из его области видимости.

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

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

См. также