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

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 Метка объекта никогда не изменяется; в частности, оператор присваивания не изменяет метку целевого значения.
Этот абзац был удалён.

Примеры

Примеры операторов присваивания:
Value := Max_Value - 1;
Shade := Blue;
Next_Frame(F)(M, N) := 2.5; -- см. 4.1.1
U := Dot_Product(V, W); -- см. 6.3
Writer := (Status => Open, Unit => Printer, Line_Count => 60); -- см. 3.8.1
Next.all := (72074, null, Head); -- см. 3.10.1
Примеры, включающие преобразования скалярных подтипов:
I, J : Integer range 1 .. 10 := 5;
K : Integer range 1 .. 20 := 15;
...
I := J; -- идентичные диапазоны
K := J; -- совместимые диапазоны
J := K; -- вызовет Constraint_Error если K > 10
Примеры, включающие преобразования подтипов массивов:
A : String(1 .. 31);
B : String(3 .. 33);
...
A := B; -- одинаковое число компонентов
A(1 .. 9) := "tar sauce";
A(4 .. 12) := A(1 .. 9); -- A(1 .. 12) = "tartar sauce"
ПРИМЕЧАНИЯ
3 Примечания к примерам: Операторы присваивания разрешены даже в случае перекрывающихся срезов одного и того же массива, так как имя variable_имя и выражение оцениваются перед копированием значения в переменную. В вышеприведённом примере реализация, дающая A(1 .. 12) = "tartartartar", будет неверной.


Spec-Zone.ru

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