15 { Константа без знака }
(Х+Y+Z) { подвыражение }
SIN(Х/2) { вызов функции }
['0..''9','А'..'Z'] { описатель множества }
not Done { отрицание булевской переменной }
сhar(Digit+48) { назначение типа }
B.Pascal 7 & Objects/LR - 96 -
Термы используются в операциях умножения на множитель:
┌─────────┐
терм ────────>│множитель├───┬──────>
^ └─────────┘ │
│ ┌───┐ │
├─────┤ * │<────────┤
│ └───┘ │
│ ┌───┐ │
├─────┤ / │<────────┤
│ └───┘ │
│ ┌───┐ │
├─────┤div│<────────│
│ └───┘ │
│ ┌───┐ │
├─────┤mod│<────────│
│ └───┘ │
│ ┌───┐ │
├─────┤and│<────────│
│ └───┘ │
│ ┌───┐ │
├─────┤shl│<────────│
│ └───┘ │
│ ┌───┐ │
└─────┤shr│<────────┘
└───┘
B.Pascal 7 & Objects/LR - 97 -
Приведем несколько примеров термов:
Х * Y
Z / (1 - Z)
Done or Error
(Х <= Y) and (Y < Z)
В простых выражениях к термам применяются операции сложения
и присваивания знака:
┌───────┐
простое выражение ────────>│ терм ├───┬────>
^ └───────┘ │
│ ┌───┐ │
├─────┤ + │<──────┤
│ └───┘ │
│ ┌───┐ │
├─────┤ - │<──────┤
│ └───┘ │
│ ┌───┐ │
├─────┤ or│<──────│
│ └───┘ │
│ ┌───┐ │
└─────┤xor│<──────┘
└───┘
Приведем несколько примеров простых выражений:
Х + Y
-Х
Hue1 + Hue2
I * J + 1
B.Pascal 7 & Objects/LR - 98 -
В выражениях к простым выражениям применяются операции отно-
шения.
┌─────────┐
выражение ────>│ простое ├──┬───────────────────────────────>
│выражение│ │ ^
└─────────┘ │ ┌───┐ ┌─────────┐ │
├─>│ < ├──────>│ простое ├──┘
│ └───┘ ^ │выражение│
│ ┌───┐ │ └─────────┘
├─>│<= ├──┤
│ └───┘ │
│ ┌───┐ │
├─>│ > ├──┤
│ └───┘ │
│ ┌───┐ │
├─>│>= ├──┤
│ └───┘ │
│ ┌───┐ │
├─>│ = ├──┤
│ └───┘ │
│ ┌───┐ │
├─>│<> ├──┤
│ └───┘ │
│ ┌───┐ │
└─>│in ├──┘
└───┘
Приведем некоторые примеры выражений:
Х = 1.5
Done <> Error
(I < J) = (J < К)
C in Huel
B.Pascal 7 & Objects/LR - 99 -
Операции
─────────────────────────────────────────────────────────────────
Операции подразделяются на арифметические операции, логичес-
кие операции, операции со строками, операции над множествами,
операции отношения и операцию @ (операция получения адреса).
Арифметические операции
─────────────────────────────────────────────────────────────────
В следующей таблице приведены типы операндов и результаты
для бинарных и унарных арифметических операций:
Бинарные арифметические операции Таблица 6.2
┌───────────┬──────────────┬──────────────────┬─────────────────┐
│ Операция │ Действие │ Типы операндов │ Тип результата │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ + │ Сложение │ Целый │ Целый │
│ │ │ Вещественный │ Вещественный │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ - │ Вычитание │ Целый │ Целый │
│ │ │ Вещественный │ Вещественный │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ * │ Умножение │ Целый │ Целый │
│ │ │ Вещественный │ Вещественный │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ / │ Деление │ Целый │ Вещественный │
│ │ │ Вещественный │ Вещественный │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ div │ Целочисленное│ │ │
│ │ деление │ Целый │ Целый │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ mod │ Остаток │ Целый │ Целый │
└───────────┴──────────────┴──────────────────┴─────────────────┘
Примечание: Операция + используется также, как опера-
ция для работы со строками и множествами. Операции +, - и *
используются также для операций над множествами.
B.Pascal 7 & Objects/LR - 100 -
Унарные арифметические операции
Таблица 6.3
┌───────────┬──────────────┬──────────────────┬─────────────────┐
│ Операция │ Действие │ Тип операнда │ Тип результата │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ + │ Сохранение │ Целый │ Целый │
│ │ знака │ Вещественный │ Вещественный │
├───────────┼──────────────┼──────────────────┼─────────────────┤
│ - │ Отрицание │ Целый │ Целый │
│ │ знака │ Вещественный │ Вещественный │
└───────────┴──────────────┴──────────────────┴─────────────────┘
Любая операция, включающая операнд, тип которого является
подмножеством порядкового типа, обрабатывается также, как если бы
он был порядкового типа.
Если оба операнда в операциях +, -, *, div или моd являются
операндами целого типа, то тип результата будет таким же, как об-
щий тип обоих операндов. (Определение общего типа см. в разделе
"Целый тип" в Главе 3).
Если один или более операндов в операциях +, -, или * имеют
вещественный тип, то тип результата будет вещественным, если ис-
пользована директива компилятора {$N-}, или типом с повышенной
точностью при использовании директивы компилятора {$N+}.
Если при использовании операции сохранения знака или опера-
ции отрицания знака операнд имеет целый тип, то результат будет
тоже целого типа. Если операнд вещественного типа, то тип резуль-
тата будет вещественным или типом с повышенной точностью
(extended).
Значение выражения х/у всегда будет вещественного типа
(real) или с повышенной точностью (extended), независимо от типов
операндов. Если у равно 0, то результат будет ошибочным.
Значение выражение i div j представляет собой математическое
частное от i/j, округленное в меньшую сторону до значения целого
типа. Если j равно 0, результат будет ошибочным.
Операция mod возвращает остаток, полученный путем деления
двух ее операндов, то есть:
i mod j = i - (i div j) * j
Знак результата операции mod будет тем же, что и знак i. Ес-
ли j равно нулю, то результатом будет ошибка.
B.Pascal 7 & Objects/LR - 101 -
Логические операции
─────────────────────────────────────────────────────────────────
Типы логических операций показаны в Таблице 6.4.
Логические операции Таблица 6.4
┌──────────┬─────────────────────┬──────────────┬───────────────┐
│ Операция │ Действие │Типы операндов│ Тип результата│
├──────────┼─────────────────────┼──────────────┼───────────────┤
│ not │ Отрицание (битовое) │ Целый │ Целый │
│ and │ И (битовое) │ Целый │ Целый │
│ or │ ИЛИ (битовое) │ Целый │ Целый │
│ xor │ Исключающее ИЛИ │ Целый │ Целый │
│ │ (битовое) │ │ │
│ shl │ Сдвиг влево │ Целый │ Целый │
│ shr │ Сдвиг вправо │ Целый │ Целый │
└──────────┴─────────────────────┴──────────────┴───────────────┘
Примечание: Операция not является унарной операцией.
Если операндом операции not является операнд целого типа, то
результат будет также целого типа.
Если оба операнда в операциях or, and или xor целого типа,
то тип результата будет таким же, как тип обоих операндов.
Операции i shl j и i shr j сдвигают значение i влево или
вправо на j битов. Тип результата будет таким же, как тип i.
Булевские операции
─────────────────────────────────────────────────────────────────
Типы операндов и результат для булевских операций показаны в
Таблице 6.5.
Таблица 6.5 Булевские операции
┌──────────┬──────────────────┬─────────────────┬───────────────┐
│ Операция │ Действие │ Типы операндов │ Тип результата│
├──────────┼──────────────────┼─────────────────┼───────────────┤
│ not │ Отрицание │ Булевский │ Булевский │
│ and │ Логическое И │ Булевский │ Булевский │
│ or │ Логическое ИЛИ │ Булевский │ Булевский │
│ xor │ Логическое │ │ │
│ │ исключающее ИЛИ │ Булевский │ Булевский │
└──────────┴──────────────────┴─────────────────┴───────────────┘
Примечание: Операция not является унарной операцией.
Результаты этих операций соответствуют обычной булевой логи-
ке. Например, выражение a and b является истинным (принимает зна-
чение Тruе) только в том случае, если оба операнда a и b имеют
истинное значение (Тruе).
B.Pascal 7 & Objects/LR - 102 -
В Borland Pascal поддерживаются две различные модели генера-
ции кода для операций or и and - полное вычисление и вычисление
по короткой схеме (частичное вычисление).
При полном вычислении подразумевается, что каждый операнд
булевского выражения, построенный с помощью операций or и and,
всегда будет вычисляться, даже если результат всего выражения уже
известен. Эта модель полезна в том случае, когда один или более
операндов в выражении представляют собой функции с побочными эф-
фектами, которые изменяют смысл программы.
Вычисление по короткой схеме обеспечивает строгое вычисление
слева направо. Это вычисление прекращается, как только результат
всего выражения становится очевиден. Во многих случаях эта модель
удобна, поскольку она обеспечивает минимальное время выполнения
и, как правило, минимальный объем кода. Вычисление по короткой
схеме делает также возможными такие конструкции, которые в про-
тивном случае были бы недопустимы, например:
while (I<=Lenght(S)) and (S[I]<>' ') do
Inc(I);
while (P<>nil) and (P^.Value<>5) do
P:=P^.Next;
В обоих случаях, если результатом первого вычисления будет
значение False, вычисление второго выражения не выполняется.
Схему вычисления можно задавать с помощью директивы компиля-
тора $B. Значением по умолчанию является состояние {$B-} (пока
оно не будет изменено с помощью "меню" возможностей компилятора).
В этом случае генерируется код с вычислением по короткой схеме. В
случае директивы {$B+} генерируется код с полным вычислением.
Поскольку в стандартном Паскале не определяется, какую схему
следует использовать для вычисления булевских выражений, то прог-
раммы, зависящие от действия какой-либо конкретной схемы, в дейс-
твительности не являются переносимыми. Однако, если пожертвовать
переносимостью, то очень часто можно получить значительный выиг-
рыш во времени выполнения и простоте, которую позволяет получить
вычисление по короткой схеме.
B.Pascal 7 & Objects/LR - 103 -
Операция со строками
─────────────────────────────────────────────────────────────────
Типы операндов и результаты для операции со строками показа-
ны в Таблице 6.6.
Операции со строками Таблица 6.6
┌───────────┬──────────────┬─────────────────────┬──────────────┐
│ Операция │ Действие │ Типы операндов │Тип результата│
├───────────┼──────────────┼─────────────────────┼──────────────┤
│ + │ Конкатенация │ Строковый, │ Строковый │
│ │ │ символьный или │ │
│ │ │упакованный строковый│ │
└───────────┴──────────────┴─────────────────────┴──────────────┘
Borland Pascal позволяет использовать операцию + для объеди-
нения двух строковых операндов. Результатом операции s + t, где s
и t имеют строковый тип, символьный тип (Char) или упакованный
строковый тип, будет конкатенация s и t. Результат будет совмес-
тим с любым строковым типом (но не с символьным Char и не с упа-
кованным строковым типом). Если длина результирующей строки пре-
вышает 255 символов, то она усекается до 255 символов.
B.Pascal 7 & Objects/LR - 104 -
Операции над символьными указателями
─────────────────────────────────────────────────────────────────
Расширенный синтаксис (разрешенный по директиве компилятора
{$X+}) поддерживает несколько операций с указателями на PChar.
Для увеличения и уменьшения смещения указателя можно использовать
операции + и -. Минус можно также использовать для вычисления
расстояния (разности) между двумя символьными указателями. Если P
и Q - это значения типа PChar, а I - значение типа Word, то до-
пустимы следующие конструкции:
Допустимые конструкции PChar Таблица 6.7
┌───────────────┬───────────────────────────────────────────────┐
│ Операция │ Результат │
├───────────────┼───────────────────────────────────────────────┤
│ P + I │ Сложение I со смещением P. │
│ I + P │ Сложение I со смещением P. │
│ P - I │ Вычитание I из смещения P. │
│ P - Q │ Вычитает смещение Q из смещения P. │
└───────────────┴───────────────────────────────────────────────┘
Операции P + I и I + P складывает I c адресом, заданным P,
создавая указатель, ссылающийся на I символов после P. Операция P
- I вычитает I из адреса, заданного P, создавая указатель, ссыла-
ющийся на I символов перед P.
Операция P - Q вычитает расстояние между Q (младший адрес) и
P (старший адрес), создавая в результате значение типа Word, по-
казывающее число символов между Q и P. Эта операция подразумева-
ет, что P и Q ссылаются на один символьный массив. Если два сим-
вольный указателя ссылаются на разные массивы, то результат будет
не определен.
B.Pascal 7 & Objects/LR - 105 -
Операции над множествами
─────────────────────────────────────────────────────────────────
Типы операндов для операций над множествами показаны в Таб-
лице 6.7.
Операции над множествами Таблица 6.7
┌───────────────┬─────────────┬─────────────────────────────────┐
│ Операция │ Действие │ Типы операндов │
├───────────────┼─────────────┼─────────────────────────────────┤
│ + │ Объединение │ Множества с совместимыми типами │
│ - │ Разность │ Множества с совместимыми типами │
│ * │ Пересечение │ Множества с совместимыми типами │
└───────────────┴─────────────┴─────────────────────────────────┘
Результаты операций соответствуют правилам логики работы с
множествами:
1. Порядковое значение c содержится в a+b только тогда,
когда оно содержится в a или в b.
2. Порядковое значение c содержится в a-b только тогда,
когда оно содержится в a и не содержится в b.
3. Порядковое значение c содержится в a*b только тогда,
когда он содержится в обоих множествах a и b.
Если наименьшим порядковым значением, которое является чле-
ном результата операций над множествами, является a, а наибольшим
- b, то типом результата будет множество a..b.
B.Pascal 7 & Objects/LR - 106 -
Операции отношения
─────────────────────────────────────────────────────────────────
Типы операндов и результаты операций отношения приведены в
Таблице 6.8.
Таблица 6.8 Операции отношения
┌─────────┬────────────┬────────────────────────┬───────────────┐
│ Операция│ Действие │ Типы операндов │ Тип результата│
├─────────┼────────────┼────────────────────────┼───────────────┤
│ = │ Равно │ Совместимый простой, │ Булевский │
│ │ │ указатель, множествен- │ │
│ │ │ ный строковый или упа- │ │
│ │ │ кованный строковый │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ <> │ Не равно │ Совместимый простой, │ Булевский │
│ │ │ указатель, множествен- │ │
│ │ │ ный, строковый или упа-│ │
│ │ │ кованный строковый │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ < │ Меньше чем │ Совместимый простой, │ Булевский │
│ │ │ указатель, множествен- │ │
│ │ │ ный, строковый или упа-│ │
│ │ │ кованный строковый │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ > │ Больше чем │ Совместимый простой, │ Булевский │
│ │ │ указатель, множествен- │ │
│ │ │ ный строковый или упа- │ │
│ │ │ кованный строковый │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ <= │ Меньше │ Совместимый простой, │ Булевский │
│ │ или равно │ указатель, множествен- │ │
│ │ │ ный строковый или упа- │ │
│ │ │ кованный строковый │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ >= │ Больше │ Совместимый простой, │ Булевский │
│ │ или равно │ указатель, множествен- │ │
│ │ │ ный строковый или упа- │ │
│ │ │ кованный строковый │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ <= │Подмножество│ Множества совместимых │ Булевский │
│ │ │ типов │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ >= │Надмножество│ Множества совместимых │ Булевский │
│ │ │ типов │ │
├─────────┼────────────┼────────────────────────┼───────────────┤
│ in │ Элемент │ Левый операнд: любой │ Булевский │
│ │ множества │ перечислимый тип t; │ │
│ │ │ правый: множество, │ │
│ │ │ совместимое с t. │ │
└─────────┴────────────┴────────────────────────┴───────────────┘
B.Pascal 7 & Objects/LR - 107 -
Сравнение простых типов
─────────────────────────────────────────────────────────────────
Когда операции =, <>, <, >, >= или <= применяются для опе-
рандов простых типов, то это должны быть совместимые типы. Одна-
ко, если один операнд имеет вещественный тип, то другой может
быть целого типа.
Сравнение строк
─────────────────────────────────────────────────────────────────
Операции отношения =, <>, <, >, >= или <= могут применятся
для сравнения строк согласно порядку расширенного набора символов
кода ASСII. Любые два значения строковых данных можно сравнить,
поскольку все значения строковых данных совместимы.
Значения символьного типа совместимы со значениями строково-
го типа, и при их сравнении символьное значение обрабатывается
как строковое значение с длиной 1. Когда со значением строкового
типа сравнивается упакованное строковое значение из N элементов,
то оно обрабатывается, как значение строкового типа длиной N.
Сравнение упакованных строк
─────────────────────────────────────────────────────────────────
Операции отношения =, <>, <, >, >= или <= могут применятся
также для двух упакованных значений строкового типа, если они со-
держат одинаковое число элементов. Если число элементов равно n,
то операция соответствует сравнению двух строк, каждая из которых
имеет длину n.
Сравнение указателей
─────────────────────────────────────────────────────────────────
Операции = и <> могут использоваться для сравнения операндов
типа указатель. Два указателя равны только в том случае, если они
ссылаются на один и тот же объект.
B.Pascal 7 & Objects/LR - 108 -
Сравнение символьных указателей
─────────────────────────────────────────────────────────────────
При разрешении по директиве компилятора {$X+} расширенного
синтаксиса операции =, <>, <, >, >= или <= могут применятся к
значениям PChar. Заметим, однако, что эти операции отношения
предполагают, что два сравниваемые указателя ссылаются на один и
тот же символьный массив.. По этой причине в сравнении участвуют
только смещения двух значений-указателей. Если указатели ссылают-
ся на разные символьные массивы, результат будет не определен.
Сравнение множеств
─────────────────────────────────────────────────────────────────
Если операндами являются множества a и b, то при их сравне-
нии получаются следующие результаты:
1. Выражение a=b истинно (= True) только когда a и b содер-
жат одни и те же элементы, в противном случае a<>b.
2. Выражение a = b истинно, когда каждый элемент множества
а является также элементом множества b.
3. Выражение a = b истинно, когда каждый элемент множества
b является также элементом множества a.
Проверка на принадлежность к множеству
─────────────────────────────────────────────────────────────────
Операция in возвращает истинное значение (True), когда зна-
чение элемента порядкового типа является элементом операнда мно-
жественного типа, в противном случае он возвращает значение
False.
B.Pascal 7 & Objects/LR - 109 -
Операция @
─────────────────────────────────────────────────────────────────
Операция @ используется в адресном коэффициенте для вычисле-
ния адреса переменной, процедуры, функции или метода. В Таблице
