В Турбо Паскале определены следующие операции: унарные 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 .......
|