Справочник по Ada 2012
4.5.3 Двоичные операторы сложения
Статическая семантика
Двоичные операторы сложения + (сложение) и – (вычитание) определены для каждого числового типа T со своим обычным значением. Они имеют следующие спецификации:
function "+"(Left, Right : T) return T
function "-"(Left, Right : T) return T
function "-"(Left, Right : T) return T
Операторы конкатенации & определены для каждого нелимитированного одномерного массива типа T с типом компонента C. Они имеют следующие спецификации:
function "&"(Left : T; Right : T) return T
function "&"(Left : T; Right : C) return T
function "&"(Left : C; Right : T) return T
function "&"(Left : C; Right : C) return T
function "&"(Left : T; Right : C) return T
function "&"(Left : C; Right : T) return T
function "&"(Left : C; Right : C) return T
Динамическая семантика
При вычислении конкатенации с типом результата T, если оба операнда имеют тип T, результатом конкатенации является одномерный массив, длина которого равна сумме длин операндов, а компоненты содержат компоненты левого операнда, за которыми следуют компоненты правого операнда. Если левый операнд является нулевым массивом, результатом конкатенации является правый операнд. В противном случае нижняя граница результата определяется следующим образом:
- Если конечный предок типа массива был определён с помощью constrained_array_definition, то нижняя граница результата соответствует нижней границе типа индекса;
- Если конечный предок типа массива был определён с помощью unconstrained_array_definition, то нижняя граница результата соответствует нижней границе левого операнда.
Верхняя граница определяется нижней границей и длиной. Проверяется, принадлежит ли верхняя граница результата конкатенации диапазону типа индекса, если результат не является нулевым массивом. Если эта проверка не пройдена, генерируется Constraint_Error.
Если любой из операндов имеет тип компонента C, результат конкатенации определяется вышеуказанными правилами, используя вместо такого операнда массив, содержащий этот операнд как единственный компонент (преобразованный к типу компонента), и имеющий нижнюю границу типа индекса типа массива.
Результат конкатенации определяется в терминах присваивания анонимному объекту, как и для любого вызова функции (см. 6.5).
ПРИМЕЧАНИЯ
15 Как и для всех предопределенных операторов над модульными типами, двоичные операторы сложения + и – над модульными типами включают в себя конечное приведение по модулю модуля, если результат находится вне базового диапазона типа.
Примеры
Примеры выражений, использующих двоичные операторы сложения:
Z + 0.1 -- Z должен быть типа вещественного числа
"A" & "BCD" -- конкатенация двух строковых литералов
'A' & "BCD" -- конкатенация символьного литерала и строкового литерала
'A' & 'A' -- конкатенация двух символьных литералов
'A' & "BCD" -- конкатенация символьного литерала и строкового литерала
'A' & 'A' -- конкатенация двух символьных литералов