4.4. Знаки операций в Turbo Pascal 7
Все операции в 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 (ИЛИ), хоr (ИСКЛЮЧАЮЩЕЕ ИЛИ). Они определяются таблицами истинности 6 и 7.
Таблица 6. Таблица истинности операции NOT
X |
not X |
False True |
True False |
Таблица 7. Таблица истинности операций AND, OR и XOR
X |
Y |
X and Y |
X 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. В этом случае несколько уменьшается время вычисления.
Выбор вида вычисления осуществляется с помощью ключа компилятора $B (см. п. 17.7.1). Если используется ключ {$В-} (этот вариант выбирается по умолчанию), производится укороченное вычисление. Если выбран ключ {$В+}, производится полное вычисление. Неправильный выбор вида вычисления может иногда привести к ошибке.
Пример. Случай, когда необходимо использовать укороченное вычисление логического выражения.
if (i >= Low(Arr)) and (i <= High(Arr)) and (Arr[ij < 0) then Arr[i] := -Arr[i];
В этом примере проверяется знак некоторого i-ro элемента массива Аrr (см. п. 6.1), содержащего числа: (Аrr < 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 и 11) 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; |
{если нет элемента} |
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, xor можно использовать для побитовых операций с целыми, при этом тип результата определяется наименьшим типом операндом (имеющим наименьший размер). В применении к целым числам эти операции имеют следующий смысл:
not - унарная операция инверсии всех битов целого числа;
and - побитовая логическая операция И двух целых чисел;
or - побитовая логическая операция ИЛИ двух целых чисел;
хог - побитовая логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ двух целых чисел.
К этой же группе можно отнести операции shl и shr, имеющие следующий смысл:
shl - операция I shl J сдвигает содержимое I на J битов влево. Освободившиеся биты заполняются нулями.
shr - операция I shr J сдвигает содержимое I на J битов вправо. Освободившиеся биты заполняются нулями.
Пример. Использование операций с битами информации.
Необходимо ввести целое число без знака. Если это число четное - вывести его старший байт, а если нечетное - младший (аналогично действиям стандартных функций Hi и Lo - см. п. 16.1).
program EXAMPLE3; |
|
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. Операции отношения
Операции отношения предназначены для сравнения двух величин (величины должны быть сравнимых типов). Результат сравнения имеет логический тип. Операции отношения следующие:
= |
- |
равно; |
|
|
|
|
<= |
- |
меньше или равно; |
<> |
- |
не равно; |
|
|
|
|
>= |
- |
больше или равно; |
< |
- |
меньше; |
|
|
|
|
> |
- |
больше. |
Примечание. Операции отношения используются также для указателей, строк, множеств. Их применение в этих случаях будет рассмотрено ниже.
|