Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

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

Примеры

Примеры операторов присваивания:
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"
Операторы присваивания определены корректно даже в случае перекрывающихся срезов одного и того же массива, поскольку variable_имя и выражение вычисляются до копирования значения в переменную. В приведённом примере реализация, дающая A(1 .. 12) = "tartartartar", будет неправильной.


Spec-Zone.ru

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