1 Логические операторы включают: and, or, not, xor
Эти операторы принимают булевы значения как аргументы, результат операции также является булевым;
Если оба операнда — целые числа, то конструкции and/or/not/xor превращаются в побитовые операторы, результат вычисления будет целым числом.
2 Операторы отношения (сравнения): =, <>, >, <, <=, >=.
Если вы разбираетесь в языках семейства C, обязательно обратите внимание на эти различия:
В Pascal для проверки равенства используется один знак равенства A = B (в языках C пишут A == B);
Собственный оператор присваивания в Pascal — символ :=.
Логические и побитовые операторы имеют более высокий приоритет, чем операторы отношения.
Чтобы регулировать порядок вычислений, отдельные выражения нужно оборачивать скобками, иначе появятся логические ошибки или произойдёт сбой компиляции.
Неверный пример (вызов ошибки компиляции)
var
A, B: Integer;
begin
if A = 0 and B <> 0 then ... // Неверная записьCode language: JavaScript (javascript)
Причина ошибки компиляции:
По правилам приоритета компилятор сначала выполнит центральную побитовую операцию И 0 and B (вернёт целое число);
Далее вычислится конструкция A = (0 and B), получится булево значение;
После этого программа попытается выполнить операцию между булевым значением и целым числом 0, что вызовет ошибку несоответствия типов (type mismatch).
Правильная запись
var
A, B: Integer;
begin
if (A = 0) and (B <> 0) then ...Code language: HTML, XML (xml)
Правила короткого замыкания вычислений (Short-circuit evaluation)
Возьмём в качестве примера выражение if MyFunction(X) and MyOtherFunction(Y) then..., правила работы следующие:
- Оператор
and: сначала выполняется левая частьMyFunction(X)- Если левая часть возвращает
false, итоговый результат всего выражения гарантированно равенfalse, правая функцияMyOtherFunction(Y)не будет выполнена ни разу.
- Если левая часть возвращает
- Оператор
orработает по аналогичному принципу:- Если левая часть уже вернула
true, общий результат будет истинным, код справа не запустится.
- Если левая часть уже вернула
Эта особенность крайне полезна при проверке нулевого указателя:
if (A <> nil) and A.IsValid then...Code language: HTML, XML (xml)
Программа не завершится аварийно, даже если переменная A — нулевой указатель nil. Ключевое слово nil обозначает нулевой указатель, численно оно равно 0 и соответствует конструкции null в других языках.
Классификация операторов
Операторы отношения (возвращают булево значение Boolean)
| Pascal | Значение | Аналог в языке C |
|---|---|---|
= | Равно | == |
<> | Не равно | != |
> | Больше | > |
< | Меньше | < |
>= | Больше или равно | >= |
<= | Меньше или равно | <= |
Логические / побитовые операторы
not: Логическое НЕ / Побитовое инвертирование and: Логическое И / Побитовое И or: Логическое ИЛИ / Побитовое ИЛИ xor: Исключающее ИЛИ / Побитовое исключающее ИЛИ
not (НЕ)
| a | not a |
|---|---|
| true | false |
| false | true |
and (И — истина только при истинности обеих частей)
| a | b | a and b |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
or (ИЛИ — истина при истинности хотя бы одной части)
| a | b | a or b |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
xor (Исключающее ИЛИ — истина только при разных значениях операндов)
| a | b | a xor b |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
Примеры
Правила определения високосного года
- Год делится на 4, но не делится на 100 → високосный год
- Год делится на 400 → високосный год, все остальные годы обычные
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program LeapYearCheck;
// Функция проверки високосного года, принимает год, возвращает булево значение
function IsLeapYear(year: Integer): Boolean;
begin
Result := ((year mod 4 = 0) and (year mod 100 <> 0)) or (year mod 400 = 0);
end;
var
y: Integer;
begin
Write('Введите год: ');
ReadLn(y);
if IsLeapYear(y) then
Writeln(y, ' — високосный год')
else
Writeln(y, ' — обычный год');
ReadLn;
end.Code language: JavaScript (javascript)

mod— оператор остатка от деления, записьyear mod 4 = 0означает, что год делится на 4 без остатка- Выражения обязательно оборачивайте скобками: оператор
andимеет выше приоритет, чем операторы сравнения - Эффект короткого замыкания: если условие делимости на 400 перед оператором
orвыполняется, проверка условий на 4 и 100 не производится
Логические, отношения и побитовые операторы