Логические операторы and, or и not в Pascal

Создано: 03.04.2026

Представьте, что какие-то действия зависят от значения не одной, а двух переменных. Или значение одной переменной должно попадать в определенный диапазон, чтобы что-то произошло. В таких случаях придется использовать две проверки, причем вторая будет вложена в первую.

var
    a, b: integer;
begin
    readln(a, b); 

    if a > 80 then
        if b > 75 then
            writeln('Отлично');            
end.
var
    t: integer;
begin
    readln(t); 

    if t >= 12 then
        if t <= 24 then
            writeln('Комфортная температура');            
end.

Однако на естественном языке мы можем выразить такие сложные условия одной фразой. Например, "a должно быть больше 80-ти и (в то же время) b должно быть больше 75-ти", "температура должна быть не ниже 12-ти и не выше 24-х".

Подобное, то есть составление сложных логических выражений, есть и в языках программирования. Для этого там предусмотрены специальные логические операторы, часто используемыми из которых являются and и or. Первый переводится как "и" (союз), второй — как "или". Зная об этом, перепишем наши примеры таким образом, чтобы в заголовке условного оператора было сложное условие, но при этом мы избавились бы от вложенного условного оператора:

if (a > 80) and (b > 75) then
    writeln('Отлично');
if (t >= 12) and (t <= 24) then
    writeln('Комфортная температура');

В Паскале необходимо брать в скобки операции сравнения, потому что в нем сначала выполняются логические операторы (and, or, xor, not), а уже потом операторы отношений (>, >=, <, <=, <>, =). Другими словами, логические операторы имеют приоритет над операторами сравнения.

Дополните любую из программ со сложным логическим выражением веткой else. Почему это было бы не так просто сделать, когда использовался вложенный условный оператор?

Теперь обратим внимание на то, при каких условиях операция с and возвращает истину, и это позволяет выполнится телу if. У нас два условия — слева и справа от and, и оба они должны быть правдой. Если хотя бы одно будет ложью, не говоря уже о двух, то все сложное логическое выражение считается ложным.

Если необходимо составить такое логическое выражение, при котором достаточно истины хотя бы с одной стороны от логического оператора, то используется or. Рассмотрим пример:

var
    a, b: integer;

begin
    readln(a, b); 

    if (a > 0) or (b > 0) then 
        writeln('Положительное число имеется');        
            
end.

При выполнении этой программы фраза будет выводиться на экран в трех случаях: когда оба числа положительные; когда первое положительное, а второе — нет; когда второе положительное, а первое — нет. Случай, когда фраза не появится, только один: когда обе переменные не имеют положительного значения.

Посмотрите на код ниже. В какой диапазон должно попадать значение переменной t, чтобы условие было истинным? Какая фраза подошла бы для вывода на экран?

if (t <= -15) or (t >= 30) then
    writeln('...');

В отличие от and и or оператор not (отрицание) является унарным. Это значит, что более простое логическое выражение ставится только с одной стороны от него — справа. В условии ниже сначала проверяется, что a делится нацело на b (в этом случае остаток будет равен нулю). Если это не так, то выражение в скобках возвращает ложь. Но мы ее отрицаем с помощью not, поэтому ложь становится правдой, и тело if исполняется.

var
    a, b: integer;

begin
    readln(a, b); 

    if not (a mod b = 0) then
        writeln('Второе число не является делителем первого')
    else 
        writeln(a div b);
            
end.

Перепишите эту программу таким образом, чтобы тела веток поменялись местами.

Сложные логические выражения могут состоять больше, чем из двух простых, то есть в них будет не один из операторов and, or, not, а несколько, возможно разных. В этом случае важно знать приоритет их выполнения между собой. Он такой: сначала not, потом and, в конце or. Если его нужно изменить, то используются скобки.

var
    a, b: integer;

begin
    readln(a, b); 

    if not (a >= 0) and (b > 0) then begin
        writeln('Первое отрицательное');
        writeln('Второе положительное');
    end;
        
    if not ((a > 0) and (b > 0)) then 
        writeln('Нет двух положительных');            
end.
-5 7
Первое отрицательное
Второе положительное
Нет двух положительных
6 -4
Нет двух положительных

Задания для дополнительной или самостоятельной работы:

  1. Всегда ли можно избавиться (или имеет смысл это делать) от вложенного условного оператора с помощью составления сложного логического выражение? Приведите пример программы, которая иллюстрирует верный ответ на этот вопрос.
  2. В уроке не был рассмотрен оператор xor (исключающее "или"). Напишите программу, выполнение которой поможет вам понять, в каких случаях он возвращает истину, а в каких — ложь.
  3. Напишите программу, которая проверяет, что среднее значение двух переменных попадает в определенный диапазон, например от 80 до 100.