Справочник Ada 95
5.2 Операторы присваивания
Оператор assignment_statement заменяет текущее значение переменной результатом вычисления выражения.
Синтаксис
assignment_statement ::=
имя_переменной:= выражение;
имя_переменной:= выражение;
Выполнение оператора assignment_statement включает в себя вычисление выражения и присваивание значения выражения в целевую переменную. Операция присваивания (в отличие от оператора assignment_statement) также выполняется в других контекстах, включая инициализацию объектов и передачу параметров по значению. Целевая переменная — это представление объекта, которому присваивается значение; целевая переменная оператора assignment_statement — это переменная, обозначаемая именем переменной variable_name.
Правила разрешения имен
Имя_переменной оператора assignment_statement должно быть любого неограниченного типа. Ожидаемый тип для выражения — это тип целевой переменной.
Правила легальности
Целевая переменная, обозначенная именем variable_name, должна быть переменной.
Если целевая переменная имеет тип метки класса T'Class, то выражение должно быть либо динамически помеченным, либо типа T и с неопределенной меткой (см. 3.9.2).
Динамическая семантика
При выполнении оператора assignment_statement имя_переменной и выражение сначала вычисляются в произвольном порядке.
Когда тип целевой переменной является типом класса:
- Если выражение имеет неопределенную метку (см. 3.9.2), то управляющее значение метки для выражения — это метка целевой переменной;
- В противном случае (выражение имеет динамическую метку), проверяется, что метка значения выражения совпадает с меткой целевой переменной; если проверка не пройдена, генерируется исключение Constraint_Error.
Значение выражения преобразуется в подтип целевой переменной. Преобразование может вызвать исключение (см. 4.6).
В случаях с контролируемыми типами, целевая переменная завершается, и анонимный объект может быть использован как промежуточный при присваивании, как описано в 7.6.1, «Завершение и финализация». В любом случае, преобразованное значение выражения затем присваивается целевой переменной, что состоит из двух шагов:
- Значение целевой переменной становится преобразованным значением.
- Если какая-либо часть целевой переменной контролируется, её значение корректируется, как объяснено в разделе 7.6.
ПРИМЕЧАНИЯ
2 Метка объекта никогда не меняется; в частности, оператор assignment_statement не меняет метку целевой переменной.
3 Значения дискриминант объекта, обозначенного значением доступа, не могут быть изменены (даже при присваивании полного значения самому объекту), так как такие объекты всегда ограничены; однако подкомпоненты таких объектов могут быть неограничены.
Примеры
Примеры операторов присваивания:
Значение := Максимальное_Значение - 1;
Оттенок := Синий;
Оттенок := Синий;
Писатель := (Статус => Открыт, Устройство => Принтер, Количество_Строк => 60); -- см. 3.8.1
Следующий_Автомобиль.all := (72074, null); -- см. 3.10.1
Следующий_Автомобиль.all := (72074, null); -- см. 3.10.1
Примеры, включающие преобразования скалярных подтипов:
I, J : Целое в_диапазоне 1 .. 10 := 5;
K : Целое в_диапазоне 1 .. 20 := 15;
...
K : Целое в_диапазоне 1 .. 20 := 15;
...
I := J; -- идентичные диапазоны
K := J; -- совместимые диапазоны
J := K; -- вызовет Constraint_Error, если K > 10
K := J; -- совместимые диапазоны
J := K; -- вызовет Constraint_Error, если K > 10
Примеры, включающие преобразования подтипов массивов:
A : Строка(1 .. 31);
B : Строка(3 .. 33);
...
B : Строка(3 .. 33);
...
A := B; -- одинаковое количество компонентов
A(1 .. 9) := "tar sauce";
A(4 .. 12) := A(1 .. 9); -- A(1 .. 12) = "tartar sauce"
A(4 .. 12) := A(1 .. 9); -- A(1 .. 12) = "tartar sauce"
ПРИМЕЧАНИЯ
4 Примечания к примерам: операторы Assignment_statement разрешены даже в случае перекрывающихся срезов одного и того же массива, поскольку имя_переменной и выражение вычисляются до копирования значения в переменную. В приведенном выше примере, реализация, приводящая к A(1 .. 12) = "tartartartar" будет неверной.