Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
17.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
71.68 Кб
Скачать

17.2.2. Определения для оператора for.

Синтаксические правила для оператора FOR:

<оператор FOR> ::= FOR <идентификатор переменной> := <список FOR> DO <оператор>

<список FOR> ::= <выражение> TO <выражение>

| <выражение> DOWNTO <выражение>

Контрольная переменная и выражения в списке FOR могут быть порядкового типа. Контрольная переменная должна быть идентификатором и не может появляться в левой части присваиваний внутри цикла. Значение контрольной переменной не определено после завершения выполнения оператора FOR. На некоторых Паскаль-машинах контрольная переменная может иметь значение после завершения оператора FOR, использование ее значения для дальнейших вычислений является плохой практикой, поскольку это не будет работать одинаково на всех Паскаль-машинах.

Значение оператора FOR может быть дано через эквивалентный оператор WHILE. Но нужно принимать во внимание несколько различий между двумя операторами. Наиболее очевидное соответствие неверно. Оператор FOR:

FOR Index := E1 TO E2

DO

S

не эквивалентен:

Index := E1;

WHILE Index <=E2

DO

BEGIN

S;

Index := SUCC(Index)

END

Контрольная переменная в операторе WHILE не является неопределенной после завершения цикла как это происходит в операторе FOR. Тело оператора WHILE будет выполнено последний раз, когда Index уже имеет то же значение что и E2.

Если бы это значение было последним в перечислимом типе, последнее вычисление SUCC в теле цикла привело бы к аварийному завершению, чего не происходит в цикле FOR. Также, операторы присваивания в операторе S могут изменить количество итераций в операторе WHILE, чего не происходит в операторе FOR. Приведенный ниже операторFOR выполняет пять итераций, даже если First и Last изменяются после начала выполнения.

First := 1;

Last := 5;

FOR Index := First TO Last

DO

BEGIN

First := First + 1;

Last := Last – 1;

WRITELN(Index, First, Last)

END

Выполнение:

OUTPUT: 1 2 4

2 3 3

3 4 2

4 5 1

5 6 0

Некоторые из этих различий могут быть устранены использованием контрольной переменной, которая более нигде в программе не появляется (скажем T1 и T2) и разворачиванием первого выполнения в цикле.

T1 := E1;

T2 := E2;

IF T1 <= T2

THEN

BEGIN

Index := T1;

S;

WHILE Index <> T2

DO

BEGIN

Index := SUCC(Index);

S

END

END

Хотя эта последовательность операторов ближе к значению оператора FOR, она по прежнему оставляет Index определенной в конце цикла.

Прямое определение оператора FOR может быть дано следующим образом:

FOR V := E1 TO E2 DO S

где переменная V принадлежит порядковому типу T, имеет значение:

FOR V := E1 TO E2 DO S(t) =

(VAR V: TT◦VAR V: T)(tn) если SUCCn-1 (E1) (t) = E2 (t), где

tn = S ( V := SUCC(V) (tn-1))

t1 = S ( V := E1 (t));

(VAR V: TT◦VAR V: T)(t) если (E1) (t) > E2 (t).

С помощью композиции VAR V: TT◦VAR V: T управляющая переменная удаляется из состояния выполнения б потом снова вставляется как будто была вновь объявлена. В результате, при выходе из оператора FOR она не определена.

Оператор FOR использующий DOWNTO определяется аналогично.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]