5.2. ОПЕРАТОРЫ ПРИСВАИВАНИЯ

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

оператор-присваивания ::= имя-переменной := выражение;

При выполнении оператора присваивания вначале вычисляются имя переменной и выражение в порядке, не определенном в языке. Затем, если переменная не является массивом, проверяется принадлежность значения выражения подтипу переменной (если же переменная — массив, то при присваивании производится преобразование подтипа, как описано в разд. 5.2.1). Наконец, значение выражения становится новым значением переменной.

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

Примеры:

VALUE := MAX_VALUE - 1;SHADE := BLUE;NEXT_FRAME(F)(M, N) := 2.5; --CM. 4.1.1 U := DOT_PRODUCT(V, W);     -- CM. 6.5WRITER := (STATUS => OPEN, UNIT => PRINTER, LINE_COUNT => 60); -- CM. 3.7.3NEXT_CAR.all := (72074, null); -- CM. 3.8.1

Примеры проверок ограничений:

I,J : INTEGER range 1 ..10;К : INTEGER range 1 ..20;I := J; --одинаковые диапазоны К := J; -- совместимые диапазоны J := К; -- при К<10 возбудится исключение CONSTRAINT_ERROR

Примечание. Значения дискриминантов объекта, указанного ссылочным значением, не могут быть изменены (даже присваиванием составного значения всему объекту), поскольку такие объекты, созданные генераторами, всегда являются ограниченными (см. 4.8); подкомпоненты таких объектов могут и не быть ограниченными.

Если выражение в правой части является числовым литералом, именованным числом или атрибутом, вырабатывающим результат типа универсальный-целый или универсальный-вещественный, то производится неявное преобразование типа, описанное в разд. 4.6.

Определение типа переменной в левой части оператора присваивания может потребовать рассмотрения выражения, если имя переменной может интерпретироваться как имя переменной, указанной ссылочным значением, возвращаемым вызовом функции, а также как компонента или отрезок такой переменной (см. разд. 8.7 о контексте разрешения совмещения).

Ссылки: вызов функции 6.4, выражение 4.4, вычисление 4.5, генератор 4.8, дискриминант 3.7.1, имя 4.1, исключение CONSTRAINT_ERROR 11.1, компонента 3.6, 3.7, массив 3.6, неявное преобразование типа 4.6, объект 3.2, отрезок 4.1.2, ошибочный 1.6, переменная 3.2.1, подкомпонента 3.3, подтип 3.3, преобразование подтипа 4.6, присваивание массива 5.2.1, совмещение 6.6, 8.7, ссылочный тип 3.8, тип 3.3, указывать 3.8, универсальный-вещественный тип 3.5.6, универсальный-целый тип 3.5.4, числовой литерал 2.4.

5.2.1. ПРИСВАИВАНИЯ МАССИВОВ

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

Это значит, что новое значение каждой компоненты индексируемой переменной задается сопоставляемой ей компонентой индексируемого значения, полученного при вычислении выражения (см. определение сопоставляемых компонент в 4.5.2). При преобразовании подтипа для каждой компоненты индексируемой переменной проверяется наличие сопоставляемой компоненты индексируемого значения, и наоборот. При отрицательном результате этой проверки возбуждается исключение CONSTRAINT_ERROR, а значение каждой компоненты переменной не изменяется.

Примеры:

А : STRING(1 .. 31); В : STRING(3 .. 33);...А := B; — одинаковое количество компонентА(1 .. 9) := "tar sauce"; А(4 .. 12) := A(1 .. 9); -- А(1 .. 12) = "tartar Sauce"

Примечание. Присваивание массива определено даже в случае перекрывающихся отрезков, поскольку выражение в правой части вычисляется До присваивания компонент. Так, в случае последнего из приведенных примеров реализация, вырабатывающая А(1 .. 12) = = "tartartartar", была бы некорректной^.

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

Ссылки: исключение CONSTRAINT_ERROR 11.1, массив 3.6, отрезок 4.1.2, переменная 3.2.1, преобразование подтипа 4.6, присваивание 5.2, сопоставляемые индексируемые компоненты 4.5.2, тип 3.3.

1) Покомпонентная пересылка недопустима. — Прим. ред.