Справочное руководство по языку Ада-83



              

Операторы цикла


Оператор цикла содержит последовательность операторов, выполнение которой повторяется несколько раз или ни одного раза. \

оператор-цикла ::= [простое-имя-цикла:] [схема-итерации] loop последовательность - операторов end loop [простое-имя-цикла]; схема-итерации ::= while условие | for спецификация-параметра-цикла спецификация-параметра-цикла ::= идентификатор in [reverse] дискретный-диапазон

Если в операторе цикла используется простое имя цикла, то оно должно задаваться как в начале, так и в конце этого оператора.

Оператор цикла без схемы итерации определяет повторяемое выполнение последовательности операторов. Выполнение такого оператора цикла заканчивается выходом из цикла вследствие выполнения оператора выхода или какой-либо другой передачи управления (см. 5.1).

Для оператора цикла со схемой итерации while перед каждым выполнением последовательности операторов вычисляется условие; если значением условия является TRUE, то последовательность операторов выполняется, если FALSE, то выполнение оператора цикла заканчивается.

Для оператора цикла со схемой итерации for спецификация параметра цикла является описанием параметра цикла с заданным в схеме итерации идентификатором. Параметр цикла — это объект, типом которого является базовый тип дискретного диапазона (см. 1). В пределах последовательности операторов параметр цикла считается константой. Поэтому его использование в качестве переменной в левой части оператора присваивания недопустимо. Параметр цикла не должен использоваться в качестве параметра вида out или in out оператора вызова процедуры или входа, а также в качестве параметра вида in out конкретизации настройки.

Для выполнения оператора цикла с итерационной схемой for сначала предвыполняется спецификация параметра цикла. При этом создается параметр цикла и вычисляется дискретный диапазон.

Если дискретный диапазон пуст, то выполнение оператора цикла заканчивается. В противном случае последовательность операторов выполняется по одному разу для каждого значения из дискретного диапазона (при условии, что не происходит выхода из цикла из-за выполнения оператора выхода или какой-либо другой передачи управления). Перед каждой такой итерацией параметру цикла присваивается соответствующее значение из дискретного диапазона. При отсутствии зарезервированного слова reverse эти значения присваиваются в порядке возрастания, при наличии этого слова — в порядке убывания.

Пример оператора цикла без схемы итерации:

loop GET(CURRENT_CHARACTER); exit when CURRENT_CHARACTER = '*'; end loop;

Пример оператора цикла со схемой итерации while:

while BID(N).PRICE < CUT_OFF.PRICE loop RECORD_BID(BID(N).PRICE); N := N + 1; end loop;

Пример оператора цикла со схемой итерации for:

for J in BUFFER'RANGE loop -— правильно даже для пустого диапазона if BUFFER(J) /= SPACE then PUT(BUFFER(J)); end if; end loop;

Пример оператора цикла с простым именем цикла:

SUMMATION: while NEXT /= HEAD loop -— CM. 3.8 SUM := SUM + NEXT.VALUE; NEXT := NEXT.SUCC; end loop SUMMATION;

Примечание. Область действия параметра цикла простирается от спецификации параметра цикла до конца оператора цикла, а правила видимости таковы, что параметр цикла видим только в пределах последовательности операторов в цикле.

Дискретный диапазон цикла вычисляется только один раз. Использование зарезервированного слова reverse не изменяет дискретный диапазон, так что следующие схемы итерации не эквивалентны (в первой — диапазон пуст):

for J in reverse 1 .. 0 for J in 0 .. 1

Имена циклов используются также в операторах выхода и в расширенных именах (в качестве префикса имени параметра цикла).

Ссылки: альтернатива завершения 1, базовый тип 3.3, видимость 8.3, возбуждение исключений 11, вызов процедуры 6.4, вычисление 4.5, граница диапазона 3.5, дискретный диапазон 1, зарезервированное слово 2.9, идентификатор 2.3, конкретизация настройки 12.3, константа 1, контекст разрешения совмещения 8.7, логическое значение FALSE 3, логическое значение TRUE 3, область действия 8.2, объект 3.2, оператор возврата 5.8, оператор вызова входа 9.5, оператор выхода 5.7, оператор перехода 5.9, оператор присваивания 5.2, описание 3.1, последовательность операторов 5.1, пред'выполнение 3.1, преобразование 4.6, префикс 4.1, простое имя 4.1, пустой диапазон 3.5, расширенное имя 3, условие 5.3, фактический параметр 1, фактический параметр настройки 12.3, целый тип 4.









Содержание  Назад  Вперед