Справочник по Ada 2005
5.2 Операторы присваивания
Оператор присваивания заменяет текущее значение переменной результатом вычисления выражения.
Синтаксис
Выполнение оператора присваивания включает вычисление выражения и присваивание значения выражения в целевое место. Операция присваивания (в отличие от оператора присваивания) также выполняется и в других контекстах, включая инициализацию объектов и передачу параметров по значению. Целевое место операции присваивания — это представление объекта, которому присваивается значение; целевое место оператора присваивания — это переменная, обозначаемая variable_имя.
Правила разрешения имен
variable_имя оператора присваивания может быть любого типа. Ожидаемый тип для выражения — это тип целевого места.
Правила допустимости
Целевое место, обозначаемое variable_имя, должно быть переменной неограниченного типа.
Если целевое место имеет тип-класс-обозначение T'Class, то выражение должно быть либо динамически помечено, либо типа T и с неопределенной меткой (см. 3.9.2).
Динамическая семантика
При выполнении оператора присваивания сначала variable_имя и выражение вычисляются в произвольном порядке.
Когда тип целевого места является классовым:
- Если выражение имеет неопределенную метку (см. 3.9.2), то управляющее значение метки для выражения — метка целевого места;
- В противном случае (выражение динамически помечено), проверяется, что метка значения выражения совпадает с меткой целевого места; если проверка не пройдена, поднимается исключение Constraint_Error.
Значение выражения преобразуется к подтипу целевого места. Преобразование может вызвать исключение (см. 4.6).
В случаях с управляемыми типами целевое место завершается, и анонимный объект может использоваться как промежуточный при присваивании, как описано в 7.6.1, «Завершение и финализация». В любом случае преобразованное значение выражения затем присваивается целевому месту, что состоит из следующих двух шагов:
- Значение целевого места становится преобразованным значением.
- Если какая-либо часть целевого места управляема, её значение корректируется, как объяснено в разделе 7.6.
ПРИМЕЧАНИЯ
2 Метка объекта никогда не изменяется; в частности, оператор присваивания не изменяет метку целевого места.
Этот абзац был удален.
Примеры
Примеры операторов присваивания:
Значение := Max_Value - 1;
Оттенок := Синий;
Оттенок := Синий;
Писатель := (Статус => Открытый, Устройство => Принтер, Счёт_строк => 60); -- см. 3.8.1
Next_Car.all := (72074, null); -- см. 3.10.1
Next_Car.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) := "тар-соус";
A(4 .. 12) := A(1 .. 9); -- A(1 .. 12) = "тар-тар-соус"
A(4 .. 12) := A(1 .. 9); -- A(1 .. 12) = "тар-тар-соус"
ПРИМЕЧАНИЯ
3 Примечания к примерам: операторы присваивания разрешены даже в случае перекрывающихся срезов одного массива, потому что variable_имя и выражение вычисляются до копирования значения в переменную. В примере выше реализация, дающая A(1 .. 12) = "тар-тар-тар-тар", была бы неверной.