Для чего нужны логические операторы

5.7 – Логические операторы

Хотя операторы отношения (сравнения) могут использоваться для проверки того, является ли конкретное условие истинным или ложным, они могут проверять только одно условие за раз. Но часто нам нужно знать, выполняются ли одновременно несколько условий. Например, чтобы проверить, выиграли ли мы в лотерею, мы должны сравнить, все ли выбранные нами числа совпадают с выигрышными числами. В лотерее с 6 числами это будет включать 6 сравнений, и все они должны быть верными. В других случаях нам нужно знать, выполняется ли какое-либо из нескольких условий. Например, мы можем решить пропустить работу сегодня, если мы заболели, или если мы слишком устали, или если мы выиграли в лотерею в нашем предыдущем примере. Это потребует проверки того, верно ли какое-либо из трех сравнений.

Возможность тестирования несколько условий нам дают логические операторы.

В C++ есть 3 логических оператора:

Логическое НЕ (NOT)

Вы уже сталкивались с унарным оператором логического НЕ в уроке «4.9 – Логические (булевы) значения». Мы можем резюмировать эффекты логического НЕ следующим образом:

Логическое НЕ часто используется в условных выражениях:

Следует остерегаться того, что логическое НЕ имеет очень высокий уровень приоритета. Начинающие программисты часто делают следующую ошибку:

Эта программа напечатает:

Правильный способ написать приведенный выше фрагмент:

Лучшая практика

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

Логическое ИЛИ (OR)

Логическое ИЛИ (оператор || )

Левый операндПравый операндРезультат
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

Например, рассмотрим следующую программу:

Вы можете связать вместе множество операторов логического ИЛИ:

Начинающие программисты иногда путают оператор логическое ИЛИ ( || ) с оператором побитовое ИЛИ ( | ) (который будет рассмотрен позже). Несмотря на то, что у них обоих в названии есть «ИЛИ», они выполняют разные функции. Их смешивание, вероятно, приведет к неверным результатам.

Логическое И (AND)

Логическое И (оператор && )

Левый операндПравый операндРезультат
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

Как и в случае с логическим ИЛИ, вы можете связать вместе множество операторов логическое И:

Вычисление по короткой схеме

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

Если x не равно 1, всё условие должно быть ложным, поэтому ++y никогда не вычисляется! Таким образом, y будет инкрементироваться только в том случае, если x равен 1, что, вероятно, не совсем то, что задумывал программист!

Предупреждение

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

Как и в случае с логическим и побитовым ИЛИ, начинающие программисты иногда путают оператор логическое И ( && ) с оператором побитовое И ( & ).

Смешивание И и ИЛИ

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

Многие программисты предполагают, что логическое И и логическое ИЛИ имеют одинаковый приоритет (или забывают, что это не так), точно так же, как сложение/вычитание и умножение/деление. Однако логическое И имеет более высокий приоритет, чем логическое ИЛИ, поэтому операторы логическое И будут вычисляться перед операторами логическое ИЛИ (если они не заключены в скобки).

Лучшая практика

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

Закон де Моргана

Закон де Моргана говорит нам, как логическое НЕ должно распределяться в этих случаях:

Другими словами, когда вы распределяете логическое НЕ, вам также необходимо преобразовать логическое И в логическое ИЛИ, и наоборот!

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

Где логический оператор исключающее ИЛИ (XOR)?

Логический оператор исключающее ИЛИ (XOR) – это логический оператор, представленный на некоторых языках, который используется для проверки истинности нечетного числа условий.

Логическое исключающее ИЛИ

Левый операндПравый операндРезультат
falsefalsefalse
falsetruetrue
truefalsetrue
truetruefalse

Это выражение можно расширить до нескольких операндов следующим образом:

Обратите внимание, что приведенные выше шаблоны логического исключающего ИЛИ работают только в том случае, если операнды являются логического типа (не целочисленными значениями). Если вам нужна форма логического исключающего ИЛИ, которая работает с не-логическими операндами, вы можете использовать static_cast для преобразования их в bool :

Небольшой тест

Вопрос 1

Вычислите следующие выражения.

Примечание: в ответах мы «объясняем нашу работу», показывая вам шаги, предпринятые для получения окончательного ответа. Шаги разделены символом →. Выражения, которые были проигнорированы из-за правила вычисления по короткой схеме, помещены в квадратные скобки. Например,

a) (true && true) || false

b) (false && true) || true

Источник

Создание темы Часть 1. Логические операторы

Для чего нужны логические операторы. Смотреть фото Для чего нужны логические операторы. Смотреть картинку Для чего нужны логические операторы. Картинка про Для чего нужны логические операторы. Фото Для чего нужны логические операторы

Зачем нужны логические операторы?

Логических операторы помогают комбинировать ключевые слова в теме, чтобы настроить более точный поиск, а именно:

обозначить расстояние между словами;

добавить уточняющие слова;

исключить определенные слова из мониторинга и т. д.

Логические операторы в YouScan:

Для чего нужны логические операторы. Смотреть фото Для чего нужны логические операторы. Смотреть картинку Для чего нужны логические операторы. Картинка про Для чего нужны логические операторы. Фото Для чего нужны логические операторы

Вместо оператора И можно использовать AND. Вместо ИЛИOR. Они взаимозаменяемы.

Чтобы находить слова, которые стоят в тексте рядом, используйте оператор /1. Так вы будете находить упоминания, где между вашими словами есть только пробел. Например: кока /1 кола.

Чтобы находить названия, которые состоят из двух одинаковых слов, используйте кавычки. Например: «кря кря».

Пробел между словами в запросе приравнивается к оператору И

Максимальный размер поискового запроса — 4000 символов.

Регистр букв (большие или маленькие) не важен.

В запросах на русском языке существительные и прилагательные пишите в единственном числе мужского рода, тогда система просклоняет их автоматически. Например: красный /1 крест. Исключение — слова с буквой ё. Их указывайте во всех нужных вариантах (разный род, падежи, числа).

Слова с буквой ё пишите в двух вариантах: через «ё» и через «е».

Глаголы в русском языке указывайте в инфинитиве — спряжение произойдет автоматически.

Для всех языков, кроме русского и английского, указывайте слова во всех нужных вариантах. Меняйте их по родам, падежам, числам.

☝️ Эти правила работают как для ключевых, так и для стоп-слов.

Кстати, мы подготовили для вас пошаговую инструкцию по настройке новой темы, она ТУТ.

Источник

Для чего нужны логические операторы

2) Логическое сложение или дизъюнкция:

Таблица истинности для дизъюнкции

ABF
111
101
011
000

3) Логическое отрицание или инверсия:

Таблица истинности для инверсии

A¬ А
10
01

4) Логическое следование или импликация:

«A → B» истинно, если из А может следовать B.

Обозначение: F = A → B.

Таблица истинности для импликации

ABF
111
100
011
001

5) Логическая равнозначность или эквивалентность:

Источник

Логические операторы

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

Давайте рассмотрим их подробнее.

Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:

В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.

Существует всего четыре возможные логические комбинации:

Если значение не логического типа, то оно к нему приводится в целях вычислений.

Обычно оператор || используется в if для проверки истинности любого из заданных условий.

Можно передать и больше условий:

ИЛИ «||» находит первое истинное значение

Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.

Расширенный алгоритм работает следующим образом.

При выполнении ИЛИ || с несколькими значениями:

Оператор || выполняет следующие действия:

Значение возвращается в исходном виде, без преобразования.

Другими словами, цепочка ИЛИ «||» возвращает первое истинное значение или последнее, если такое значение не найдено.

Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».

Получение первого истинного значения из списка переменных или выражений.

Сокращённое вычисление.

Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется «сокращённым вычислением», поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения.

Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной.

В приведённом ниже примере x не изменяется:

Присваивание – лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.

Как мы видим, этот вариант использования || является «аналогом if «. Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.

Оператор И пишется как два амперсанда && :

Источник

Логические операторы в 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 их ещё зовут условными. Значения их операндов могут быть только булева типа.

В отличие от двойных, одиночные & и | называются операторами полной схемы вычислений. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях).

В чём разница

В том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости.

То есть иногда результат выражения однозначно определён уже по первому операнду:

&& и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях.

Как использовать

&& и || позволяют экономить вычисления (применять короткую схему) и помогают избегать ошибок. Как это делается?

Начнём с оператора &&. Приведём фрагмент из таблицы выше:

Логический операторОбозначение в JavaВыражениеРезультат
«И» (AND): конъюнкция, логическое умножение&&true && true

Рассмотрим выражение: (3 > 4) AND (5 > 4)

Мы видим, что операнд слева от оператора AND равен false. Смотрим на таблицу выше — и понимаем, что вычислять второй операнд бессмысленно, так как оператор AND уже точно вернёт false.

Именно по такой логике и работает оператор короткой схемы вычислений &&. Если выражение слева от него равно false, то выражение справа вычисляться не будет.

Так же и с оператором ||: если выражение слева от него равно true, то выражение справа не вычисляется, так как результат операции || всё равно будет true.

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

Если вместо оператора && мы используем &, то получим ошибку (исключение) java.lang.ArithmeticException: / by zero:

Ошибка возникнет тогда, когда Java попытается вычислить второй аргумент логического выражения, если первый равнялся false.

Код выше выводит в консоль длину строки str, в которой есть хотя бы один символ. А если строка пуста или её значение равно null (то есть строковая переменная ни на что не указывает), в консоль выводится сообщение: « Тут нечего считать!»

Мы выбрали оператор короткой схемы вычислений && — и это правильно!

А вот если бы вместо этого использовали оператор полной схемы &, то наш код работал бы не так, как надо.

Мы получали бы ошибку NullPointerException каждый раз, когда вызываем метод для строковой переменной со значением null.

Посмотрим, что происходило бы при вычислении условия блока if:

Дальше Java должна вычислить второй аргумент логического выражения, а именно str.length() > 0 (иными словами — проверяется «Число символов строки > 0?»).

Для этого вызывается метод str.length(), который должен вернуть целое значение. Оно и будет сравниваться с 0. Но у нас-то str равна null (возвращать методу нечего, строки нет). Тут Java и пожалуется на NullPointerException.

Порядок выполнения операторов

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

Если одинаковые операции стоят по соседству, то раньше выполняется та, что левее.

Вычислим true ^ true & false:

Теперь самый приоритетный оператор в выражении это ^ — и порядок вычислений будет уже другой:

Результат будет false.

Как изменить порядок вычисления

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

Добавив круглые скобки, мы поменяли приоритеты для вычисления. Теперь сперва будет определено выражение ( true ^ true), которое вернёт false. А после — вычислится выражение false & false, которое тоже вернёт false.

То есть скобки повышают приоритет стоящего внутри выражения, а внутри самих скобок действуют прежние приоритеты.

Как логические операторы работают с целыми числами

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

Выходит, применять логические операторы к целочисленным аргументам нельзя?

Можно. Внутри Java все целочисленные типы представлены двоичными числами разной длины. И к ним уже применимы бинарные логические операторы ^, | и &.

Только в этом случае они работают с двоичным представлением операндов — выполняют операции над их битами попарно (рассматривая их как логические единицы и нули). Поэтому и сами операторы ^, | и & зовутся побитовыми.

Как ^, | и & работают с целочисленными операндами

Чтобы повторить вычисления Java, нужно:

Потренируемся: вычислим сами 3 & 5

Число 3 в двоичной системе счисления имеет вид 11, а число 5 — 101.

Так как у числа 5 три разряда в двоичной системе, а у числа 3 — всего два, добавим лидирующий ноль к числу 3 в двоичной системе и получим 011.

Берём цифры из обоих чисел и применяем к ним попарно оператор & (AND):

3 (10) = 011 (2)011
&&&
5 (10) = 101 (2)101
===
001 (2) = 1 (10)001

Получаем число 001. В десятичной записи ему соответствует число 1. Поэтому операция 3 & 5 и возвращает в результате 1.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *