Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

5.2 Операторы присваивания

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

Синтаксис

assignment_statement ::=
variable_имя := выражение;
Выполнение оператора присваивания включает вычисление выражения и присваивание значения выражения в целевое место. Операция присваивания (в отличие от оператора присваивания) также выполняется и в других контекстах, включая инициализацию объектов и передачу параметров по значению. Целевое место операции присваивания — это представление объекта, которому присваивается значение; целевое место оператора присваивания — это переменная, обозначаемая 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;
Оттенок := Синий;
Next_Frame(F)(M, N) := 2.5; -- см. 4.1.1
U := Dot_Product(V, W); -- см. 6.3
Писатель := (Статус => Открытый, Устройство => Принтер, Счёт_строк => 60); -- см. 3.8.1
Next_Car.all := (72074, null); -- см. 3.10.1
Примеры с преобразованиями скалярных подтипов:
I, J : Целое диапазон 1 .. 10 := 5;
K : Целое диапазон 1 .. 20 := 15;
...
I := J; -- одинаковые диапазоны
K := J; -- совместимые диапазоны
J := K; -- вызовет Constraint_Error если K > 10
Примеры с преобразованиями подтипов массивов:
A : Строка(1 .. 31);
B : Строка(3 .. 33);
...
A := B; -- то же количество компонентов
A(1 .. 9) := "тар-соус";
A(4 .. 12) := A(1 .. 9); -- A(1 .. 12) = "тар-тар-соус"
ПРИМЕЧАНИЯ
3 Примечания к примерам: операторы присваивания разрешены даже в случае перекрывающихся срезов одного массива, потому что variable_имя и выражение вычисляются до копирования значения в переменную. В примере выше реализация, дающая A(1 .. 12) = "тар-тар-тар-тар", была бы неверной.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API