RSS

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.

Таблица 3.1

Операция

Действие

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

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

not

Отрицание

Логический

Логический

not

То же

Любой целый

Тип операнда

@

Адрес

Любой

Указатель

*

Умножение

Любой целый

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

*

То же

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

Exended

*

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

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

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

/

Деление

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

Extended

div

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

Любой целый

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

mod

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

То же

То же

and

Логическое И

Логический

Логический

and

То же

Любой целый

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

shl

Левый сдвиг

То же

То же

shr

Правый сдвиг

То же

То же

+

Сложение

То же

То же

+

То же

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

Extended

+

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

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

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

+

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

Строковый

Строковый

Вычитание

Любой целый

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

То же

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

Extenden

or

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

Логический

Логический

or

Тоже

Любой целый

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

=

Равно

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

Логический

<>

Не равно

То же

То же

<

Меньше

Логический

Логический

<=

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

То же

То же

>

Больше

То же

То же

>=

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

То же

То же

При действиях с вещественным типом одним из операндов может быть значение любого целого типа. Результат операций имеет указанный в таблице тип EXTENDED только для установленного в среде Турбо Паскаля режима генерации кода, рассчитанного на арифметический сопроцессор или на его эмуляцию (см. прил.1). Если этот режим не установлен, результат будет иметь значение типа 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.

Таблица 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 = ‘ , n or m) ;

WriteLn(‘ xor= ‘ , n xor m)

WriteLn( ‘ shl= ‘ ,n shl m)

WriteLn( ‘ shr= ‘ , n shr m)

end

end.

В программе организуется ввод двух произвольных целых чисел и печать результата применения к ним всех логических операций. Для выхода из программы следует нажать Ctrl-z, и Enter.

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

Таблица 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 …….