Статус документа
Статус документа

ГОСТ 27831-88 (ИСО 8652-87) Язык программирования АДА

     4.5. Операции и вычисление выражения


В языке определены шесть классов операций. При описании функций, определяющих пользовательские операции, в качестве обозначений могут быть использованы приведенные ниже знаки операции (исключая / =). Шесть классов операций приведены в порядке возрастания их старшинства.

логическая_операция : : = and or xor

операция_отношения : : = = / = < <= > > =

бинарная_аддитивная_операция : : = + - &

унарная_аддитивная_операция : : = + -

мультипликативная_операция : : = * / mod rem

операция_высшего_приоритета : := ** abs not

Формы управления с промежуточной проверкой and then и or else имеют тот же порядок старшинства, что и логические операции. Проверки принадлежности in и not in имеют то же старшинство, что и операции отношения.

В слагаемом, простом выражении, отношении или выражении, группирование операций с их операндами проводится сначала для операций с большим старшинством, а затем для операций с меньшим старшинством. В случае последовательных операций с одинаковым старшинством группирование операций с их операндами производится в порядке их текстуального следования слева направо; для изменения порядка группирования могут использоваться скобки.

В языке не определяется порядок вычисления операндов множителя, слагаемого, простого выражения или отношения и операндов выражения, которое не содержит форм управления с промежуточной проверкой (но вычисление операндов производится до применения соответствующей операции). Правый операнд формы управления с промежуточной проверкой вычисляется тогда и только тогда, когда левый операнд имеет определенное значение (см. 4.5.1).

Для каждой формы описания типа некоторые из перечисленных операций являются предопределенными, т.е. неявно задаются описанием типа. Для каждого такого неявного описания операции именами параметров являются LEFT и RIGHT для бинарных операций; для унарных аддитивных операций и унарных операций abs и not их единственный параметр именуется RIGHT. В разд.4.5.1-4.5.7 поясняются результаты предопределенных операций.

Предопределенные операции над целыми типами либо вырабатывают математически корректный результат, либо возбуждают исключение NUMERIC_ERROR. Предопределенная операция, вырабатывающая результат целого типа (отличного от универсального_целого), может лишь возбуждать исключение NUMERIC_ERROR, только если математический результат не является значением этого целого типа. Предопределенные операции над вещественными типами вырабатывают результаты, точность которых определяется в соответствии с разд.4.5.7. Предопределенная операция, вырабатывающая результат вещественного типа (отличного от универсального_вещественного), может возбуждать исключение NUMERIC_ERROR, только если ее результат не принадлежит диапазону хранимых чисел этого типа, как это поясняется в разд.4.5.7.

Примеры старшинства

not СОЛНЦЕ or ТЕПЛО

- - совпадает с (not СОЛНЦЕ) or ТЕПЛО

Х > 4.0 and Y > 0.0

- - совпадает с (X > 4.0) and (Y > 0.0)

-4.0 * A ** 2

- - совпадает с - (4.0 * (А ** 2))

abs (1 + A) + B

- - совпадает с (abs (1 + А)) + В

Y ** (-3)

- - скобки необходимы

А/В * С

- - совпадает с (А/В) * С

А + (В + С)

- - вычисляется В + С, а затем к результату прибавляется А

4.5.1. Логические операции и формы управления с промежуточной проверкой

Приводимые в табл.4.1 логические операции предопределены для любых логических типов и любых одномерных индексируемых типов с компонентами логического типа. В обоих случаях операнды должны иметь один и тот же тип.

Таблица 4.1

Знак операции

Операция

Тип операнда

Тип результата

and

Конъюнкция

Любой логический тип

Тот же логический тип

Массив логических компонентов

Тот же индексируемый тип

or

Дизъюнкция

Любой логический тип

Тот же логический тип

Массив логических компонентов

Тот же индексируемый тип

xor

Исключающая дизъюнкция

Любой логический тип

Тот же логический тип

Массив логических компонентов

Тот же индексируемый тип



Операции над массивами выполняются покомпонентно, если компоненты есть (как для равенства, см. 4.5.2). Границы массива-результата совпадают с границами левого операнда. Для каждого компонента левого операнда проверяется наличие сопоставленного компонента правого операнда, и наоборот. При нарушении этого правила возбуждается исключение CONSTRAINT_ERROR.

Формы управления с промежуточной проверкой and then и or else определены для двух операндов логического типа и вырабатывают результат того же самого типа. Левый операнд формы управления с промежуточной проверкой всегда вычисляется первым. Если левый операнд выражения с формой and then дает значение FALSE, то правый операнд не вычисляется, и значением выражения является FALSE. Если левый операнд выражения с формой or else дает TRUE, то правый операнд не вычисляется, и значением выражения является TRUE. Если вычисляются оба операнда, то результат and then такой же, как and, а результат or else - как or.

Примечание. Обычный смысл логических операций задается таблицей истинности (см. табл.4.2).

Таблица 4.2

А

В

A and В

A or В

A xor В

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

FALSE

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

FALSE

FALSE

FALSE

FALSE