6.5. ОПЕРАЦИИ

В Object Pascal определены следующие операции:

унарные not, @ ;

мультипликативные *, /, div, mod, and, shi, shr;

аддитивные +, -, or, xor;

отношения =, <>, <, >, <=, >=, in.

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

Delphi переключателя Project | Options | Compiler | Complete

Boolean eval: при установленном переключателе вычисляются все операции отношения, при неустановленном - только те, что необходимы для однозначного определения результата исчисления.

Правила использования операций с операндами различного типа приводятся в табл. 6.1.

Таблица 6.1

Операция | Действие | Тип операндов | Тип результата
not | Отрицание | Логический | Логический
not | To же | Любой целый | Тип операнда
@ | Адрес | Любой | Указатель
* | Умножение | Любой целый | Наименьший целый
* | Тоже | Любой вещественный | Extended
* | Пересечение множеств | Множественный | Множественный
/ | Деление | Любой вещественный | Extended
div | Целочисленное деление | Любой целый | Наименьший целый
mod | Остаток от деления | Тоже | - Тоже
and | Логическое И | Логический | Логический
and | То же | Любой целый | Наименьший целый
shl | Левый сдвиг | Тоже | То же
shr | Правый сдвиг | То же | То же
+ | Сложение | Тоже | Тоже
+ | Тоже | Любой вещественный | Extended
+ | Объединение множеств | Множественный | Множественный
+ | Сцепление строк | Строковый | Строковый
- | Вычитание | Любой целый | Наименьший целый
- | Тоже | Любой вещественный | Extenden
or | Логическое или | Логический | Логический
or | Тоже | Любой целый | Наименьший целый
= | Равно | Любой простой или строковый | Логический
0 | Не равно | Тоже | Тоже
< | Меньше | Логический | Логический
<= | Меньше или равно | Тоже | Тоже
> | Больше | То же | Тоже
>= | Больше или равно | Тоже | Тоже

Унарная операция @ применяется к операнду любого типа и возвращает результат типа pointer (см. гл. 9), в котором содержится адрес операнда. Если операция @ применяется к процедуре, функции или методу в объекте, ее результатом будет адрес точки входа в эту процедуру (функцию, метод). Этот адрес можно использовать только в подпрограмме, написанной на Ассемблере, или во фрагментах

INLINE.

В Object Pascal определены следующие логические операции:

not - логическое НЕ;

and - логическое И;

or - логическое ИЛИ;

xor - исключительное ИЛИ.

Логические операции применимы к операндам целого и логического типов. Если операнды - целые числа, то результат логической операции есть тоже целое число, биты которого (двоичные разряды) формируются из битов операндов по правилам, указанным в табл. 6.2.

Таблица 6.2

Логичеcкие операции над данными целого типа (поразрядно) 5
Операнд 1 | Операнд 2 | not | and | or | xor
1 | - | 0 | - | - | -
0 | - | 1 | - | - | -
0 | 0 | - | 0 | 0 | 0
0 | 1 | - | 0 | 1 | 1
1 | 0 | - | 0 | 1 | 1
1 | 1 | - | 1 | 1 | 0

К логическим же в Object Pascal обычно относятся и две сдвиговые операции над целыми числами:

i shl j - сдвиг содержимого / на j разрядов влево; освободившиеся младшие разряды заполняются нулями;

i shr j - сдвиг содержимого i на j разрядов вправо; освободившиеся старшие разряды заполняются нулями.

В этих операциях i и у - выражения любого целого типа.

Логические операции над логическими данными дают результат логического типа по правилам, указанным в табл. 6.3.

Таблица 6.3

Логические операции над данными логического типа
Операнд 1 | Операнд 2 | not | and | or | xor
True | - | False | - | - | -
False | - | True | - | - | -
False | False | - | False | False | False
False | True | - | False | True | True
True | False | - | False | True | True
True | True | - | True | True | False

Операция отношения in применяется к двум операндам. Первым (левым) операндом должно быть выражение любого порядкового типа, вторым - множество, состоящее из элементов того же типа, или идентификатор множественного типа. Результат операции будет True, если левый операнд принадлежит множеству.