Что означает логический оператор
Логические операторы
Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
Давайте рассмотрим их подробнее.
Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:
В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.
Существует всего четыре возможные логические комбинации:
Если значение не логического типа, то оно к нему приводится в целях вычислений.
Обычно оператор || используется в if для проверки истинности любого из заданных условий.
Можно передать и больше условий:
ИЛИ «||» находит первое истинное значение
Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.
Расширенный алгоритм работает следующим образом.
При выполнении ИЛИ || с несколькими значениями:
Оператор || выполняет следующие действия:
Значение возвращается в исходном виде, без преобразования.
Другими словами, цепочка ИЛИ «||» возвращает первое истинное значение или последнее, если такое значение не найдено.
Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».
Получение первого истинного значения из списка переменных или выражений.
Сокращённое вычисление.
Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется «сокращённым вычислением», поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения.
Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной.
В приведённом ниже примере x не изменяется:
Присваивание – лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.
Как мы видим, этот вариант использования || является «аналогом if «. Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.
Оператор И пишется как два амперсанда && :
Урок №43. Логические операторы: И, ИЛИ, НЕ
Обновл. 11 Сен 2021 |
На этом уроке мы рассмотрим логические операторы И, ИЛИ и НЕ в языке С++.
Логические операторы
В то время как операторы сравнения используются для проверки конкретного условия: ложное оно или истинное, они могут проверить только одно условие за определенный промежуток времени. Но бывают ситуации, когда нужно протестировать сразу несколько условий. Например, чтобы узнать, выиграли ли мы в лотерею, нам нужно сравнить все цифры купленного билета с выигрышными. Если в лотерее 6 цифр, то нужно выполнить 6 сравнений, все из которых должны быть true.
Также иногда нам нужно знать, является ли хоть одно из нескольких условий истинным. Например, мы не пойдем сегодня на работу, если больны или слишком устали, или если выиграли в лотерею. 🙂 Нам нужно проверить, является ли хоть одно из этих трех условий истинным. Как это сделать? С помощью логических операторов! Они позволяют проверить сразу несколько условий за раз.
В языке C++ есть 3 логических оператора:
Оператор | Символ | Пример | Операция |
Логическое НЕ | ! | !x | true, если x — false и false, если x — true |
Логическое И | && | x && y | true, если x и y — true, в противном случае — false |
Логическое ИЛИ | || | x || y | true, если x или y — true, в противном случае — false |
Логический оператор НЕ
Мы уже с ним сталкивались на уроке №34.
Логический оператор НЕ (!) | |
Операнд | Результат |
true | false |
false | true |
Если операндом является true, то, после применения логического НЕ, результатом будет false. Если же операнд до применения оператора НЕ был false, то после его применения станет true. Другими словами, логический оператор НЕ меняет результат на противоположный начальному значению. Он часто используется в условных выражениях:
Следует помнить, что логический оператор НЕ имеет очень высокий уровень приоритета. Новички часто совершают следующую ошибку:
Результат выполнения программы:
Правильный способ написания программы, приведенной выше:
Правило: Если логический оператор НЕ должен работать с результатами работы других операторов, то другие операторы и их операнды должны находиться в круглых скобках.
Логический оператор ИЛИ
Если хоть одно из двух условий является истинным, то логический оператор ИЛИ является true.
Логический оператор ИЛИ (||) | ||
Левый операнд | Правый операнд | Результат |
false | false | false |
false | true | true |
true | false | true |
true | true | true |
Рассмотрим следующую программу:
Здесь мы использовали логический оператор ИЛИ, чтобы проверить, является ли хоть одно из двух условий истинным: левое ( value == 0 ) или правое ( value == 1 ). Если хоть одно из условий — true или оба сразу true, то выполняться будет стейтмент if. Если ни одно из условий не является true, то результат — false и выполняться будет стейтмент else.
Вы можете связать сразу несколько условий:
Новички иногда путают логическое ИЛИ ( || ) с побитовым ИЛИ ( | ). Хоть у них и одинаковые названия, функции они выполняют разные.
Логический оператор И
Только при условии, что оба операнда будут истинными, логический оператор И будет true. Если нет, тогда — false.
Логический оператор И (&&) | ||
Левый операнд | Правый операнд | Результат |
false | false | false |
false | true | false |
true | false | false |
true | true | true |
Например, мы хотим узнать, находится ли значение переменной х в диапазоне от 10 до 20. Здесь у нас есть два условия: мы должны проверить, является ли х больше 10 и является ли х меньше 20.
Если оба условия истинны, то выполняется часть if. Если же хоть одно или сразу оба условия ложные, то выполняется часть else.
Как и с логическим ИЛИ, мы можем комбинировать сразу несколько условий И:
Короткий цикл вычислений
Для того, чтобы логическое И возвращало true, оба операнда должны быть истинными. Если первый операнд вычисляется как false, то оператор И должен сразу возвращать false независимо от результата второго операнда (даже без его обработки). Это называется коротким циклом вычисления (англ. «short circuit evaluation») и выполняется он, в первую очередь, в целях оптимизации.
Аналогично, если первый операнд логического ИЛИ является true, то и всё условие будет true (даже без обработки второго операнда).
Как и в случае с оператором ИЛИ, новички иногда путают логическое И ( && ) с побитовым И ( & ).
Использование логических операторов И/ИЛИ
Иногда возникают ситуации, когда смешивания логических операторов И и ИЛИ в одном выражении не избежать. Тогда следует знать о возможных проблемах, которые могут произойти.
Многие программисты думают, что логические И и ИЛИ имеют одинаковый приоритет (или забывают, что это не так), так же как и сложение/вычитание или умножение/деление. Тем не менее, приоритет логического И выше приоритета ИЛИ. Таким образом, операции с оператором И всегда будут вычисляться первыми (если только операции с ИЛИ не находятся в круглых скобках).
value1 || (value2 && value3)
(value1 || value2) && value3
Законы Де Моргана
Другими словами, логические операторы И и ИЛИ меняются местами! В некоторых случаях, это даже полезно, так как улучшает читабельность.
А где же побитовое исключающее ИЛИ (XOR)?
Побитовое исключающее ИЛИ (XOR) — это логический оператор, который используется в некоторых языках программирования для проверки на истинность нечётного количества условий.
Побитовое исключающее ИЛИ (XOR) | ||
Левый операнд | Правый операнд | Результат |
false | false | false |
false | true | true |
true | false | true |
true | true | false |
5.7 – Логические операторы
Хотя операторы отношения (сравнения) могут использоваться для проверки того, является ли конкретное условие истинным или ложным, они могут проверять только одно условие за раз. Но часто нам нужно знать, выполняются ли одновременно несколько условий. Например, чтобы проверить, выиграли ли мы в лотерею, мы должны сравнить, все ли выбранные нами числа совпадают с выигрышными числами. В лотерее с 6 числами это будет включать 6 сравнений, и все они должны быть верными. В других случаях нам нужно знать, выполняется ли какое-либо из нескольких условий. Например, мы можем решить пропустить работу сегодня, если мы заболели, или если мы слишком устали, или если мы выиграли в лотерею в нашем предыдущем примере. Это потребует проверки того, верно ли какое-либо из трех сравнений.
Возможность тестирования несколько условий нам дают логические операторы.
В C++ есть 3 логических оператора:
Логическое НЕ (NOT)
Вы уже сталкивались с унарным оператором логического НЕ в уроке «4.9 – Логические (булевы) значения». Мы можем резюмировать эффекты логического НЕ следующим образом:
Логическое НЕ часто используется в условных выражениях:
Следует остерегаться того, что логическое НЕ имеет очень высокий уровень приоритета. Начинающие программисты часто делают следующую ошибку:
Эта программа напечатает:
Правильный способ написать приведенный выше фрагмент:
Лучшая практика
Если логическое НЕ предназначено для работы с результатом других операторов, другие операторы и их операнды должны быть заключены в круглые скобки.
Логическое ИЛИ (OR)
Левый операнд | Правый операнд | Результат |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | true |
Например, рассмотрим следующую программу:
Вы можете связать вместе множество операторов логического ИЛИ:
Начинающие программисты иногда путают оператор логическое ИЛИ ( || ) с оператором побитовое ИЛИ ( | ) (который будет рассмотрен позже). Несмотря на то, что у них обоих в названии есть «ИЛИ», они выполняют разные функции. Их смешивание, вероятно, приведет к неверным результатам.
Логическое И (AND)
Левый операнд | Правый операнд | Результат |
---|---|---|
false | false | false |
false | true | false |
true | false | false |
true | true | true |
Как и в случае с логическим ИЛИ, вы можете связать вместе множество операторов логическое И:
Вычисление по короткой схеме
Вычисление по короткой схеме дает еще одну возможность показать, почему операторы, вызывающие побочные эффекты, не должны использоваться в составных выражениях. Рассмотрим следующий фрагмент:
Если x не равно 1, всё условие должно быть ложным, поэтому ++y никогда не вычисляется! Таким образом, y будет инкрементироваться только в том случае, если x равен 1, что, вероятно, не совсем то, что задумывал программист!
Предупреждение
Вычисление по короткой схеме может привести к тому, что логическое ИЛИ и логическое И не будут вычислять один операнд. Избегайте использования выражений с побочными эффектами в выражениях с этими операторами.
Как и в случае с логическим и побитовым ИЛИ, начинающие программисты иногда путают оператор логическое И ( && ) с оператором побитовое И ( & ).
Смешивание И и ИЛИ
Смешивания операторов логическое И и логическое ИЛИ в одном выражении часто невозможно избежать, но это область, полная потенциальных опасностей.
Многие программисты предполагают, что логическое И и логическое ИЛИ имеют одинаковый приоритет (или забывают, что это не так), точно так же, как сложение/вычитание и умножение/деление. Однако логическое И имеет более высокий приоритет, чем логическое ИЛИ, поэтому операторы логическое И будут вычисляться перед операторами логическое ИЛИ (если они не заключены в скобки).
Лучшая практика
При смешивании логического И и логического ИЛИ в одном выражении явно заключите каждую операцию в скобки, чтобы убедиться, что они вычисляются так, как вы хотите.
Закон де Моргана
Закон де Моргана говорит нам, как логическое НЕ должно распределяться в этих случаях:
Другими словами, когда вы распределяете логическое НЕ, вам также необходимо преобразовать логическое И в логическое ИЛИ, и наоборот!
Иногда это может быть полезно при попытке упростить чтение сложных выражений.
Где логический оператор исключающее ИЛИ (XOR)?
Логический оператор исключающее ИЛИ (XOR) – это логический оператор, представленный на некоторых языках, который используется для проверки истинности нечетного числа условий.
Левый операнд | Правый операнд | Результат |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | false |
Это выражение можно расширить до нескольких операндов следующим образом:
Обратите внимание, что приведенные выше шаблоны логического исключающего ИЛИ работают только в том случае, если операнды являются логического типа (не целочисленными значениями). Если вам нужна форма логического исключающего ИЛИ, которая работает с не-логическими операндами, вы можете использовать static_cast для преобразования их в bool :
Небольшой тест
Вопрос 1
Вычислите следующие выражения.
Примечание: в ответах мы «объясняем нашу работу», показывая вам шаги, предпринятые для получения окончательного ответа. Шаги разделены символом →. Выражения, которые были проигнорированы из-за правила вычисления по короткой схеме, помещены в квадратные скобки. Например,
a) (true && true) || false
b) (false && true) || true
Логические операторы в Java
Знакомимся с каждым, узнаём про короткую и полную схемы вычислений. Проводим побитовые операции с целыми числами. Всё закрепляем на примерах.
Логические операции в Java возвращают значение типа boolean: true или false («правда» или «ложь»). Подробнее о булевом типе мы говорили здесь.
В языке Java есть шесть логических операторов. Первые четыре представлены в таблице ниже.
Логический оператор | Обозначение в Java | Выражение | Результат | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
«И» (AND): конъюнкция, логическое умножение | && | true && true false | |||||||||||||||||||||||||
Включающее «ИЛИ» (OR): дизъюнкция, логическое сложение | || | true || true true | |||||||||||||||||||||||||
Исключающее «ИЛИ» (XOR): строгая дизъюнкция, логическое вычитание | ^ | true ^ true true | |||||||||||||||||||||||||
«НЕ» (NOT): инверсия, отрицание | ! | !true Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение. Где нужны логические операторыУсловные выражения, в свою очередь, применяются в операторах ветвления ( if-else, switch, тернарном). Подробнее об этих операторах тут. Как применятьДопустим, мы хотим проверить, что значение переменной a больше значений в переменных b и c. То есть сравнить операнд a с двумя другими. Нам поможет логический оператор && (И). Логический оператор && (И) возвращает true, если слева и справа от него стоят значения true, а иначе — false. Иными словами, если оба логических высказывания истинны, то и операция && (И) возвращает истину. Как вычисляется значение выражения (a > b) && (a > c): Сначала проверяется условие ( a > b). Оно вернёт true, так как 6 больше 4. Далее проверяется условие ( a > c), которое также вернёт true, ведь 6 больше 3. Теперь у нас с двух сторон от логического оператора && стоят значения true. По определению выше или по таблице ещё выше, результат вычисления логического выражения ( true && true) равен true. Результат операции ( a > b) вернёт true, так как 6 больше 4, а операция ( a > c) уже вернёт false, так как 6 не больше 7. Значит, слева от логического оператора && стоит true, а справа — false. Следовательно, результат вычисления логического выражения (мы присвоили его булевой переменной d) будет false. Результат операции сравнения ( a > b) равен false, а что вернёт операция ( a > c), уже значения не имеет (смотрите определение выше) — результат вычисления логического выражения (мы присвоили его булевой переменной d) будет равен false. Рассмотрим примеры с другими операторами. Значение переменной d равно true. Теперь вычисляйте вы. Значение d равно false. О практическом применении XOR читайте здесь. Значение d стало true. Полные и сокращённые версии AND и OR&& и || называются сокращёнными логическими операторами AND и OR соответственно, или операторами короткой схемы вычислений. В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа. В отличие от двойных, одиночные & и | называются операторами полной схемы вычислений. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях). В чём разницаВ том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости. То есть иногда результат выражения однозначно определён уже по первому операнду: && и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях. Как использовать&& и || позволяют экономить вычисления (применять короткую схему) и помогают избегать ошибок. Как это делается? Начнём с оператора &&. Приведём фрагмент из таблицы выше:
|