3.5. Операции Турбо Паскаль В.В. Фаронов

В Турбо Паскале определены следующие операции:
унарные                      not, @;
мультипликативные      *, /, div, mod, and, shl, shr;
аддитивные                 +, -, or, xor;
отношения                  =, <>, <, >, <=, >=,in.
Приоритет операций убывает в указанном порядке, т.е. наивысшим приоритетом обладают унарные операции, низшим - операции отношения. Порядок выполнения нескольких операций равного приоритета устанавливается компилятором из условия оптимизации кода программы и не обязательно слева направо. При исчислении логических выражений операции равного приоритета всегда вычисляются слева направо, причем будут вычисляться все или только достаточные операции в зависимости от установленной в среде Турбо Паскаля опции OPTIONS/COMPILER/ COMPLETE BOOLEAN EVAL: при установленном значении этой опции вычисляются все операции отношения, при не установленном - только те, которые достаточны для получения результата.
Это обстоятельство необходимо учитывать при использовании операций отношения с функциями, в которых изменяются глобальные переменные или параметры, передаваемые по имени, например:
Function AddI(var x: Integer): Integer;
begin {AddI}
inc(x);
AddI := x end {AddI} ;
var
a,b : Integer;
begin {main}
if (a > b) or (Addl (a) > 100) then b := a;
.......
При выполнении этого фрагмента значение переменной А будет зависеть от настройки опции: если опция активизирована, значение А всегда наращивается на 1, если не активизирована - только в случае А <= В .
Правила использования операций с операндами различного типа приводятся в табл. 3.1.

Операция

Действие

Тип операндов

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

not

Отрицание

Логический

Логический

not

То же

Любой целый

Тип операнда

@

Адрес

Любой

Указатель

*

Умножение

Любой целый

Наименьший целый

*

То же

Любой вещественный

Exended

*

Пересечение множеств

Множественный

Множественный

/

Деление

Любой вещественный

Extended

div

Целочисленное деление

Любой целый

Наименьший целый

mod

Остаток от деления

То же

То же

and

Логическое И

Логический

Логический

and

То же

Любой целый

Наименьший целый

shl

Левый сдвиг

То же

То же

shr

Правый сдвиг

То же

То же

+

Сложение

То же

То же

+

То же

Любой вещественный

Extended

+

Объединение множеств

Множественный

Множественный

+

Сцепление строк

Строковый

Строковый

-

Вычитание

Любой целый

Наименьший целый

-

То же

Любой вещественный

Extenden

or

Логическое ИЛИ

Логический

Логический

or

Тоже

Любой целый

Наименьший целый

=

Равно

Любой простой или строковый

Логический

<> 

Не равно

То же

То же

Меньше

Логический

Логический

<=

Меньше или равно

То же

То же

Больше

То же

То же

>=

Больше или равно

То же

То же

При действиях с вещественным типом одним из операндов может быть значение любого целого типа. Результат операций имеет указанный в таблице тип EXTENDED только для установленного в среде Турбо Паскаля режима генерации кода, рассчитанного на арифметический сопроцессор или на его эмуляцию. Если этот режим не установлен, результат будет иметь значение типа REAL.
Унарная операция @ применяется к операнду любого типа и возвращает результат типа POINTER (см. гл.6), в котором содержится адрес операнда. Пусть, например, задано описание
type
TwoChar = array [1..2] of char; var
Int : integer; TwoCharPtr : ATwoChar;
Тогда оператор
TwoCharPtr := @Int;
приведет к тому, что в TwoCharPtr будет храниться адрес целочисленной переменной INT, которая может теперь интерпретироваться как совокупность двух символов. Поэтому возможен, например, такой оператор:
if TwoCharPtr^[1] = 'С' then...
Если операция @ применяется к процедуре, функции или методу в объекте, ее результатом будет адрес точки входа в эту процедуру (функцию, метод). Этот адрес можно использовать только в подпрограмме, написанной на ассемблере, или в фрагментах INLINE.
В Турбо Паскале определены следующие логические операции:
not - логическое НЕ;
and - логическое И;
or - логическое ИЛИ;
хоr - исключительное ИЛИ.
Логические операции применимы к операндам целого и логического типов. Если операнды - целые числа, то результат логической операции есть тоже целое число, биты которого (двоичные разряды) формируются из битов операндов по правилам, указанным в табл. 3.2.

Логические операции над данными типа INTEGER (поразрядно)

Операнд 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

К логическим же в Турбо Паскале обычно относятся и две сдвиговые операции над целыми числами:
i shl j - сдвиг содержимого i на j разрядов влево; освободившиеся младшие
            разряды заполняются нулями;
i shr j - сдвиг содержимого i на j разрядов вправо; освободившиеся старшие
            разряды заполняются нулями.
В этих операциях i и j - выражения любого целого типа.
С помощью программы примера 3.1 можно вывести на экран результат применения логических операций к двум целым числам.
Пример 3.1
{Программа вводит два целых числа и печатает результат применения к ним логических операций. Для выхода из программы ввести Ctrl-z и нажать Enter}
var
n,m : integer; begin
while not EOF do begin
Write('n,m='); ReadLn(n,m);
WriteLn( 'not = 1 , not n, 'not m);
WriteLn( ' and= ' , n and m)
WriteLn( ' or = 1 , n or m) ;
WriteLn( ' xor = 1 , n xor m)
WriteLn( 'shl = 1 ,n shl m)
WriteLn( 'shr = 1 , n shr m)
end
end.
В программе организуется ввод двух произвольных целых чисел и печать результата применения к ним всех логических операций. Для выхода из программы следует нажать Ctrl-z, и Enter.
Логические операции над логическими данными дают результат логического типа по правилам, указанным в табл. 3.3.

Логические операции над данными типа Boolean

Операнд 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, если левый операнд принадлежит множеству, например:
var
с: char; type
digit = set of ' 0 '..' 9 ' ; begin
if с in digit then .......