Включите исполнение JavaScript в браузере, чтобы запустить приложение.
14 ноя 2024

Логические операторы: И, ИЛИ, РАВНО и другие

Разбираемся с логическими операторами: AND, OR, NOT. В статье вы найдете подробное описание каждого оператора с примерами использования и синтаксисом. Разбираем, как работает приоритет логических операторов в программировании. Понятные объяснения, примеры кода и разбор сложных случаев ищите в нашей статье.

Что такое логические операторы?

Логические операторы в программировании — это инструменты, позволяющие выполнять логические операции между отдельными значениями или выражениями: объединять, сравнивать их и получать результат операции в виде логических значений true (истинно) и false (ложно). Часто операторы используются в условных конструкциях, так как позволяют изменять поведение программы в зависимости от соблюдения/несоблюдения какого-то условия.

То, как представлены логические операторы, зависит от языка программирования: в некоторых из них (например, в Python) они представлены зарезервированными словами and, or not и так далее; в то время как в других (например, в Java) они представлены символами «&&», «||», «!» и другими.

Оператор И (&&, and)

Оператор И (логическое умножение, или конъюнкция) используется, когда необходимо объединить несколько условий, например, если нужно проверить тип данных и значение переменной на соответствие какому-то условию. Выражение с И вернет значение true только в том случае, если все логические высказывания, которые им объединены, тоже истинны. Если это условие не выполняется, то результатом станет значение false. Ниже представлена таблица истинности для этого оператора — она иллюстрирует все возможные комбинации:

aba && b
FalseFalseFalse
FalseTrueFalse
TrueFalseFalse
TrueTrueTrue

Ниже представлено несколько примеров использования оператора И (на языке программирования Python):

# Проверка нескольких условий в условной конструкции

# Допустим, существует платформа, на которой функции администратора могут выполнять только

# пользователи с именем admin, при этом они должны иметь разрешение

name = 'admin'

has_permission = True

if name == 'admin' and has_permission:

    print('Доступ разрешен!')

else:

    print('У вас нет прав администратора.')

# В данном случае вернется истинное значение, так как логические высказывания истинны

# Также с помощью and можно проверить принадлежность диапазону (хоть для этого есть и другой метод)

age = 18

if age >= 20 and age <= 30:

    print('Вы можете подать заявку на стажировку.')

else:

    print('Заявку на стажировку могут оставить только студенты от 20 до 30 лет.')

# Вернется false, так как число 18 не входит в указанный диапазон
py

Также распространена ошибка, когда выражение записывается следующим образом:

if age >= 20 and <= 30:
py

Эта ошибка обусловлена интуитивным желанием написать «если возраст больше или равен 20 и меньше или равен 30, то …». Но такой код приведет к появлению ошибки во время выполнения программы, поэтому условия необходимо прописывать правильно:

if age >= 20 and age <= 30:
py

Оператор ИЛИ (||, or)

ИЛИ (логическое сложение, или дизъюнкция) тоже используется для объединения нескольких выражений. Однако он возвращает значение true в том случае, когда верно хотя бы одно из логических выражений (если верны оба выражения, то вернется также true). False же станет результатом выполнения только в том случае, когда оба выражения ложны. Ниже можно рассмотреть таблицу истинности для этого оператора:

aba || b
FalseFalseFalse
FalseTrueTrue
TrueFalseTrue
TrueTrueTrue

Пример применения логического ИЛИ (также на языке программирования Python):

# Проверка на истинность хотя бы одного условия

# Допустим, теперь, чтобы выполнять функции администратора на платформе, пользователь должен либо

# иметь имя admin, либо иметь разрешение 

name = 'admin'

has_permission = False

if name == 'admin' or has_permission:

    print('Доступ разрешен!')

else:

    print('У вас нет прав администратора.')

# В таком случае вернется true, так как одно из логических высказываний истинно

# При таком условии вернется ложное значение, так как оба логических высказывания ложны

if name == 'Mary2001' or has_permission:

# Также можно комбинировать and и or

name = 'admin'

has_permission = False

age = 25

if (name == 'admin' or has_permission) and age >= 18:

    print('Доступ разрешен!')

else:

    print('У вас нет прав администратора.')

# В таком случае вернется true
py

Иногда начинающие программисты путают логическое И и ИЛИ, поэтому лучше запомнить разницу между ними: в случае с И истинное значение возвращается, если истинны оба логических выражения, а в случае с ИЛИ — если верно хотя бы одно из них.

Оператор исключающее ИЛИ (^, xor)

Исключающее ИЛИ возвращает значение true только в случае, если истинно только одно из логических выражений. Во всех остальных случаях исключающее или возвращает false. Ниже представлена таблица истинности для этого оператора:

aba ^ b
FalseFalseFalse
FalseTrueTrue
TrueFalseTrue
TrueTrueFalse

Можно заметить, что эта таблица идентична таблице истинности для оператора ИЛИ за исключением последней строки — исключающее ИЛИ возвращает false, если оба выражения истинны.

Оператор эквивалентности ==

Оператор эквивалентности проверяет, равны ли значения между собой. Он используется часто, так как необходимость проверить значения на равенство в программировании возникает постоянно, например, когда нужно удостовериться в том, что пользователь ввел корректные данные. Он возвращает true, если значения равны (эквивалентны друг другу) и false, если они различны.

Рассмотрим несколько примеров применения оператора эквивалентности:

# Оператор эквивалентности позволяет проверять, четное ли число 

number = 2

if number%2 == 0:

    print('Число четное.')

else:

    print('Число нечетное.')

# Таким образом можно проверять корректность введенных пользователем данных

user_input = 'password12345'

correct_password = 'password12345'

if user_input == correct_password:

    print('Вы успешно авторизовались!')

else:

    print('Пароль неверный.')

# Результатом выполнения станет true, так как значения равны
py

Оператор неравенства !=

Оператор неравенства нужен тогда, когда необходимо проверить, что значения различны, например, чтобы исключить какое-то значение(-ия). В отличие от ==, он возвращает true, если значения не равны друг другу и false, если они равны.

Рассмотрим несколько примеров применения оператора неравенства:

# С помощью знака != можно искать нечетные числа

number = 2

if number%2 != 0:

    print('Число нечетное.')

else:

    print('Число четное.')

# В качестве еще одного примера можно переписать программу, которая проверяет, может ли

# пользователь выполнять функции администратора на платформе

name = 'admin'

if name != 'admin':

    print('У вас нет прав администратора.')

else:

    print('Доступ разрешен!')

# В данном случае результат будет ложным, так как значения равны

# Также при необходимости можно совместить ==, != и другие операторы

# Например, так может выглядеть программа, которая проверяет, является ли год високосным

year = 2014

if (year%4 == 0 and year%100 != 0) or year%400 == 0:

    print('Этот год високосный.')

else:

    print('Этот год невисокосный.')
py

Оператор НЕ (!, not)

Оператор НЕ (логическое отрицание) изменяет логическое значение выражения с true на false и наоборот. Другими словами, оператор НЕ приводит операнд к логическому значению, а затем меняет это значение на противоположное — то есть инвертирует его. Ниже представлена таблица истинности для логического отрицания:

a!a
FalseTrue
TrueFalse

Рассмотрим небольшой пример:

name = 'admin'

if not (name != 'admin'):

    print('Доступ разрешен!')

else:

    print('У вас нет прав администратора.')

# Сначала вычисляется результат операции в скобках — в данном случае это false

# Затем not инвертирует это значение и результатом выполнения всей операции становится true

# Этот код эквивалентен следующему коду

name = 'admin'

if name == 'admin':

    print('Доступ разрешен!')

else:

    print('У вас нет прав администратора.')
py

Приоритет логических операторов

Порядок вычисления результата в выражениях, содержащих несколько логических операторов, определяется их приоритетностью. Именно поэтому, чтобы избежать неожиданного/неправильного поведения программы, необходимо учитывать приоритет логических операторов. Ниже представлен список операторов от наиболее к наименее приоритетному:

  • НЕ (!, not);
  • И (&&, and);
  • Исключающее ИЛИ (^, xor)
  • ИЛИ (||, or);

Также важно помнить о том, что операции выполняются слева направо, поэтому если есть два выражения с одинаковым приоритетом, то первым будет выполнено то выражение, которое находится левее.

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

Рассмотрим эти особенности на программе, которая определяет, имеет ли пользователь доступ к системе:

# Допустим, чтобы доступ к системе был разрешен, пользователь должен зарегистрироваться и 

# подтвердить email, либо быть администратором (в таком случае регистрация не обязательна)

is_registered = True

email_confirmed = False

is_admin = True

# В таком случае результат выражения в скобках будет ложным, так как email не подтвержден

# Далее false сравнивается с is_admin (которое является true)

# Так как ИЛИ возвращает true, если хотя бы одно логическое высказывание верно, результатом всей 

# операции будет true

# Соответственно, если бы is_admin было ложно, то результатом операции стало бы false, и доступ был бы

# запрещен

has_access = (is_registered and email_confirmed) or is_admin

if has_access:

    print('Доступ разрешен.')

else:

    print('Доступ запрещен.')

# Теперь рассмотрим ситуацию, когда для доступа к системе регистрация обязательна, при этом

# пользователь должен либо подтвердить email, либо быть администратором

has_access = is_registered and (email_confirmed or is_admin)

# В таком случае доступ будет запрещен всем незарегистрированным пользователям, независимо от того,

# является ли он администратором
py

Цепочки сравнений

Цепочка сравнений — это такая форма записи выражения, которая позволяет использовать несколько операторов, тем самым соединяя несколько выражений.

Рассмотрим несколько примеров цепочек сравнений:

# В примерах для логического И был приведен код, который проверяет принадлежность к диапазону

# С помощью цепочки сравнений его можно сделать проще

age = 18

if 20 <= age <= 30:  # Эквивалентно age >= 20 and age <= 30

    print('Вы можете подать заявку на стажировку.')

else:

    print('Заявку на стажировку могут оставить только студенты от 20 до 30 лет.')

# Можно проверить равенство трех (и более) значений

if a == b == c:

    print('Треугольник равносторонний.')

else:

    print('Треугольник не равносторонний.')

# Несмотря на то что a == b == c проверяет равенство значений, следующий код НЕ проверяет их

# неравенство: он проверяет только неравенство a и b, b и c, неравенство a и c не проверяется

a != b != c  # Эквивалентно a != b and b != c

# Лучше избегать плохо читаемых цепочек сравнений, например

a <= b > c

a < b > c
py