Что такое логические операторы?
Логические операторы в программировании — это инструменты, позволяющие выполнять логические операции между отдельными значениями или выражениями: объединять, сравнивать их и получать результат операции в виде логических значений true (истинно) и false (ложно). Часто операторы используются в условных конструкциях, так как позволяют изменять поведение программы в зависимости от соблюдения/несоблюдения какого-то условия.
То, как представлены логические операторы, зависит от языка программирования: в некоторых из них (например, в Python) они представлены зарезервированными словами and, or not и так далее; в то время как в других (например, в Java) они представлены символами «&&», «||», «!» и другими.
Оператор И (&&, and)
Оператор И (логическое умножение, или конъюнкция) используется, когда необходимо объединить несколько условий, например, если нужно проверить тип данных и значение переменной на соответствие какому-то условию. Выражение с И вернет значение true только в том случае, если все логические высказывания, которые им объединены, тоже истинны. Если это условие не выполняется, то результатом станет значение false. Ниже представлена таблица истинности для этого оператора — она иллюстрирует все возможные комбинации:
a | b | a && b |
False | False | False |
False | True | False |
True | False | False |
True | True | True |
Ниже представлено несколько примеров использования оператора И (на языке программирования 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 не входит в указанный диапазон
Также распространена ошибка, когда выражение записывается следующим образом:
if age >= 20 and <= 30:
Эта ошибка обусловлена интуитивным желанием написать «если возраст больше или равен 20 и меньше или равен 30, то …». Но такой код приведет к появлению ошибки во время выполнения программы, поэтому условия необходимо прописывать правильно:
if age >= 20 and age <= 30:
Оператор ИЛИ (||, or)
ИЛИ (логическое сложение, или дизъюнкция) тоже используется для объединения нескольких выражений. Однако он возвращает значение true в том случае, когда верно хотя бы одно из логических выражений (если верны оба выражения, то вернется также true). False же станет результатом выполнения только в том случае, когда оба выражения ложны. Ниже можно рассмотреть таблицу истинности для этого оператора:
a | b | a || b |
False | False | False |
False | True | True |
True | False | True |
True | True | True |
Пример применения логического ИЛИ (также на языке программирования 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
Иногда начинающие программисты путают логическое И и ИЛИ, поэтому лучше запомнить разницу между ними: в случае с И истинное значение возвращается, если истинны оба логических выражения, а в случае с ИЛИ — если верно хотя бы одно из них.
Оператор исключающее ИЛИ (^, xor)
Исключающее ИЛИ возвращает значение true только в случае, если истинно только одно из логических выражений. Во всех остальных случаях исключающее или возвращает false. Ниже представлена таблица истинности для этого оператора:
a | b | a ^ b |
False | False | False |
False | True | True |
True | False | True |
True | True | False |
Можно заметить, что эта таблица идентична таблице истинности для оператора ИЛИ за исключением последней строки — исключающее ИЛИ возвращает 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, так как значения равны
Оператор неравенства !=
Оператор неравенства нужен тогда, когда необходимо проверить, что значения различны, например, чтобы исключить какое-то значение(-ия). В отличие от ==, он возвращает 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('Этот год невисокосный.')
Оператор НЕ (!, not)
Оператор НЕ (логическое отрицание) изменяет логическое значение выражения с true на false и наоборот. Другими словами, оператор НЕ приводит операнд к логическому значению, а затем меняет это значение на противоположное — то есть инвертирует его. Ниже представлена таблица истинности для логического отрицания:
a | !a |
False | True |
True | False |
Рассмотрим небольшой пример:
name = 'admin'
if not (name != 'admin'):
print('Доступ разрешен!')
else:
print('У вас нет прав администратора.')
# Сначала вычисляется результат операции в скобках — в данном случае это false
# Затем not инвертирует это значение и результатом выполнения всей операции становится true
# Этот код эквивалентен следующему коду
name = 'admin'
if name == 'admin':
print('Доступ разрешен!')
else:
print('У вас нет прав администратора.')
Приоритет логических операторов
Порядок вычисления результата в выражениях, содержащих несколько логических операторов, определяется их приоритетностью. Именно поэтому, чтобы избежать неожиданного/неправильного поведения программы, необходимо учитывать приоритет логических операторов. Ниже представлен список операторов от наиболее к наименее приоритетному:
- НЕ (!, 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)
# В таком случае доступ будет запрещен всем незарегистрированным пользователям, независимо от того,
# является ли он администратором
Цепочки сравнений
Цепочка сравнений — это такая форма записи выражения, которая позволяет использовать несколько операторов, тем самым соединяя несколько выражений.
Рассмотрим несколько примеров цепочек сравнений:
# В примерах для логического И был приведен код, который проверяет принадлежность к диапазону
# С помощью цепочки сравнений его можно сделать проще
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