Руководство по Ada (Ada 2022)
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, результат конкатенации представляет собой одномерный массив, длина которого является суммой длин операндов, а компоненты состоят из компонентов левого операнда, за которыми следуют компоненты правого операнда. Если левый операнд — это массив null, результат конкатенации — это правый операнд. В противном случае нижняя граница результата определяется следующим образом:
- Если конечный предок типа массива был определен с помощью constrained_array_definition, то нижняя граница результата — это нижняя граница типа индекса;
- Если конечный предок типа массива был определен с помощью unconstrained_array_definition, то нижняя граница результата — это нижняя граница левого операнда.
Верхняя граница определяется нижней границей и длиной. Проверяется, что верхняя граница результата конкатенации принадлежит диапазону типа индекса, если результат не является массивом null. Если эта проверка не пройдена, генерируется исключение Constraint_Error.
Если любой операнд имеет тип компонента C, результат конкатенации определяется вышеуказанными правилами, используя вместо такого операнда массив, имеющий этот операнд в качестве единственного компонента (преобразованного к типу компонента) и имеющий нижнюю границу типа индекса типа массива в качестве своей нижней границы.
Результат конкатенации определяется в терминах присваивания анонимному объекту, как и для любого вызова функции (см. 6.5).
ПРИМЕЧАНИЕ Как и для всех предопределенных операторов над модульными типами, бинарные операторы сложения + и – над модульными типами включают конечное приведение по модулю модуля, если результат находится за пределами базового диапазона типа.
Примеры
Примеры выражений, использующих бинарные операторы сложения:
Z + 0.1 -- Z должен быть вещественного типа
"A" & "BCD" -- конкатенация двух строковых литералов
'A' & "BCD" -- конкатенация символьного литерала и строкового литерала
'A' & 'A' -- конкатенация двух символьных литералов
'A' & "BCD" -- конкатенация символьного литерала и строкового литерала
'A' & 'A' -- конкатенация двух символьных литералов