Глава 4-2 ВЫРАЖЕНИЯ Часть 2
4.4. Знаки операций
Все операции в Turbo Pascal можно разбить на следующие группы:
- арифметические операции;
- логические операции;
- операции с битами информации;
- операции со строками;
- операции отношения;
- адресная операция @.
Если в операциях используется несколько данных, то их типы должны быть либо
идентичными, либо совместимыми (см. пп. 9.1 и 9.2).
В данном разделе будут рассмотрены операции и соответствующие им знаки,
используемые с данными простого типа (арифметические, логические, операции с
битами информации, операции отношения). Другие операции рассматриваются в разделах
описания данных соответствующих типов.
4.4.1. Арифметические операции
Арифметические операции применимы только к величинам целых и вещественных типов.
Их можно разделить на унарные и бинарные операции.
Унарный знак плюс +, поставленный перед величиной либо целого, либо вещественного
типа, не оказывает никакого влияния на значение этой величины.
Унарный знак минус -, поставленный перед величиной либо целого, либо вещественного
типа, приводит к изменению знака величины.
Бинарные арифметические операции и их знаки приведены в табл. 5.
Таблица 5. Арифметические операции
Знак Операция Типы операндов Тип результата
+ Сложение Целые Целый
Хотя бы один Вещественный
вещественный
- Вычитание Целые Целый
Хотя бы один Вещественный
вещественный
* Умножение Целые Целый
Хотя бы один Вещественный
вещественный
/ Деление Целые или Вещественный
вещественные
div Деление целых Целые Целые
mod Остаток от деле- Целые Целые
ния целых чисел
Примечание: Вещественный результат будет типа Extended, если используется
ключ компилятора {$N+}, и типа Real - в противном случае.
Знаки операций +, - и * используются также и с другими типами операндов,
но тогда они имеют иной смысл. В операциях деления делитель не должен равняться
нулю. При использовании знака операции, являющегося служебным словом, он должен
быть отделен от операндов хотя бы одним разделителем.
Пример.
A mod В { Если, напр., А=10 и В=3, то результат равен 1 }
С div D { Если С=10 и D=3, то результат равен 3 }
4.4.2. Логические операции
Логические операции применяются к величинам логического типа, результат операции
- тоже логического типа. Имеется одна унарная логическая операция not (ОТРИЦАНИЕ)
и три бинарные операции and (И), or (ИЛИ), xor (ИСКЛЮЧАЮЩЕЕ ИЛИ). Они определяются
таблицами истинности 6 и 7.
Таблица 6. Таблица истинности операции NOT
X not X
False True
True False
Таблица 7. Таблица истинности операций AND, OR и XOR
X Y X and Y Х or Y X xor Y
False False False False False
False True False True True
True False False True True
True True True True False
В Turbo Pascal имеется два вида вычисления логических выражений: полное и
укороченное.
Полное вычисление означает, что вычисляется каждый операнд, даже если уже
известен результат всего выражения.
Укороченное вычисление проводится до тех пор, пока не станет известен результат
всего выражения, после чего вычисление последующих операндов прекращается.
Предположим, что дано выражение A and В, где А и В - некоторые логические выражения
(операнды). При полном вычислении в любом случае вычисляются и значение А, и
значение В, а уж затем формируется значение всего выражения.
При укороченном вычислении, если величина A=False, выражение В не вычисляется,
т. к. оно не влияет на результат, который в любом случае будет False. В этом
случае несколько уменьшается время вычисления.
Выбор вида вычисления осуществляется с помощью ключа компилятора $В (см. п, 17.7.1).
Если используется ключ {$В-} (этот вариант выбирается по умолчанию), производится
укороченное вычисление. Если выбран ключ {$В+}, производится полное вычисление.
Неправильный выбор вида вычисления может иногда привести к ошибке.
Пример.
Случай, когда необходимо использовать укороченное вычисление логического
выражения:
if (i >= Low(Arr)) and (i <= High(Arr)) and (Arr[i] < 0) then
Arr[i] := - Arr[i];
В этом примере проверяется знак некоторого i-го элемента массива Arr (см. п. 6.1),
содержащего числа:(Arr < 0). Если знак отрицательный, то он заменяется на знак +.
При этом предварительно следует проверить, существует ли элемент с таким индексом:
(i >= Low (Arr)) and (i <= High (Arr)). Здесь Low и High - стандартные функции,
определяющие минимальный и максимальный индексы элемента массива - см. п. 4.3.2).
Естественно, что если элемента нет, то нельзя проверять знак такого несуществующего
элемента. Поэтому если условие
(i >= Low (Arr)) and (i <= High (Arr)) ложно, то второе условие (Arr[i] < 0)
проверять нельзя.
Это можно обеспечить только используя укороченное вычисление логического выражения.
Пример. Случай, когда необходимо использовать полное вычисление логического
выражения.
Пусть необходимо из файла (см, пп, 6.6 и II) Fil прочитать попарно находящиеся
в нем целые числа и посчитать число случаев, когда оба числа больше нуля.
Для решения задачи напишем функцию FuncRead, которая формирует одно прочитанное
число из файла.
program EXAMPLE2;
var Fil: file of Integer;
N: Word; {Счетчик пар чисел}
function FuncRead {Функция получения очередного числа}
var X: Integer;
begin
if not Eof(Fil) then {Проверка конца файла}
Read (Fil, X) {Чтение, если есть элемент}
else
X := 0; {0 - если нет элемента}
FuncRead := X
end;
begin {Основная программа}
N := 0;
while not(Eof(Fil)) do
if (FuncRead > 0) and {Проверка первого числа}
(FuncRead > 0) then {Проверка второго числа}
Inc(N); {Увеличение счетчика пар}
end.
В этом примере на каждой итерации цикла WHILE (см. п. 5.2.5) необходимо читать
по два числа. Это возможно лишь в том случае, если логическое выражение
(FuncRead > 0) and (FuncRead > 0) будет вычисляться по полной схеме.
4.4.3. Операции с битами информации
Операции not, and, or, хог можно использовать для побитовых операций с целыми
числами, при этом тип результата определяется наименьшим типом операндов (имеющим
наименьший размер). В применении к целым числам эти операции имеют следующий
смысл:
- not - унарная операция инверсии всех битов целого числа;
- and - побитовая логическая операция И двух целых чисел;
- or - побитовая логическая операция ИЛИ двух целых чисел;
- хог - побитовая логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ двух целых чисел.
К этой же группе можно отнести операции shl и shr, имеющие следующий смысл:
- shl - операция I shl J сдвигает содержимое I на J битов влево.
Освободившиеся биты заполняются нулями.
- shr - операция I shr J сдвигает содержимое I на J битов вправо.
Освободившиеся биты заполняются нулями.
Пример. Использование операций с битами информации.
Необходимо ввести целое число без знака. Если это число четное - вывести его
старший байт, а если нечетное - младший (аналогично действиям стандартных
фукнкций Hi и Lo - см. п. 16.1).
program EXAMPLES;
const Mask = $FF; {Маска выделения младшего байта}
var Value: Word;
begin
Write('Введите целое положительное число: ');
ReadLn(Value);
if Value and 1=0 then {Проверка четности}
WriteLn('Число четное, старший байт равен ',
(Value shr 8) and Mask) else
WriteLn('Число нечетное, младший байт равен ',
Value and Mask)
end.
Другой пример использования операций с битами информации см. в п. 16.3.21.
4.4.4. Операции отношения
Операции отношения предназначены для сравнения двух величин (величины должны
быть сравнимых типов). Результат сравнения имеет логический тип.
Операции отношения следующие:
= - равно;
<= - меньше или равно;
<> - не равно;
>= - больше или равно;
< - меньше;
> - больше.
Примечание.
Операции отношения используются также для указателей, строк, множеств. Их
применение в этих случаях будет рассмотрено ниже.
4.5. Круглые скобки
Круглые скобки используются для заключения в них части выражений, значения
которой необходимо выполнить в первую очередь. В выражении может быть любое
количество круглых скобок, причем количество открывающих круглых скобок должно
быть равно количеству закрывающих круглых скобок. Части выражений, заключенные
в круглые скобки, должны быть либо непересекающимися, либо вложенными друг
в друга.
4.6. Порядок вычисления выражений
Вычисление значений выражений выполняется в определенном порядке. Начинается
вычисление с определения переменных и констант (а также функций), входящих в
выражение. Они являются основой для дальнейших вычислений. Дальнейшие действия
выполняются в соответствии с их приоритетами. Так, в первую очередь вычисляются
выражения, заключенные в круглые скобки.
Для любых двух вложенных друг в друга пар круглых скобок вычисляется сначала
внутреннее выражение, а затем внешнее. Далее вычисляются значения входящих в
выражение функций и т. д. Приоритеты всех действий, выполняемых при вычислении
выражений, приведены в табл. 8.
Таблица 8. Приоритеты действий при вычислении выражений
Группа Тип действий Операции или элементы
1 Вычисления в круглых скобках ( )
2 Вычисления значений функций Функции
3 Унарные операции @, not, унарный +, унарный -
4 Операции типа умножения: *, /, div, mod, and, shl, shr
5 Операции типа сложения: +, -, or, xor
6 Операции отношения: =, <>, <, >, <=, >=, in
Примечание.
Операции @ и in будут рассмотрены в пп. 7 и 6.4 соответственно.
Следует иметь в виду что в пределах одного и того же приоритета действия не
обязательно выполняются слева направо. В целях оптимизации программы компилятор
может нарушить этот порядок вычисления. Исключение составляют укороченные
логические вычисления логических выражений, где вычисления всегда выполняются
слева направо.
Пример.
(X > 0) and (X < 5)
В этом примере сначала выполняются две операции сравнения (операции 6-й группы),
а затем логическая операция (операция 4-й группы).