Spec-Zone.ru › Ada 95
Справочник 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;
Оттенок := Синий;
Следующий_Кадр(F)(M, N) := 2.5; -- см. 4.1.1
U := Скалярное_Произведение(V, W); -- см. 6.3
Писатель := (Статус => Открыт, Устройство => Принтер, Количество_Строк => 60); -- см. 3.8.1
Следующий_Автомобиль.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) := "tar sauce";
A(4 .. 12) := A(1 .. 9); -- A(1 .. 12) = "tartar sauce"
ПРИМЕЧАНИЯ
4 Примечания к примерам: операторы Assignment_statement разрешены даже в случае перекрывающихся срезов одного и того же массива, поскольку имя_переменной и выражение вычисляются до копирования значения в переменную. В приведенном выше примере, реализация, приводящая к A(1 .. 12) = "tartartartar" будет неверной.


Spec-Zone.ru

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