Для чего могут использоваться операторы и или
Перейти к содержимому

Для чего могут использоваться операторы и или

  • автор:

Логические операторы И ИЛИ НЕ — Теория

Ранее мы рассматривали конструкции if-else, в которых содержалось одно условие.
Но часто в программировании рассматриваются несколько условий — для их комбинирования используются логические операторы: И, ИЛИ и НЕ

Логический оператор И (&&)
Все выражения в условии должны быть ИСТИННЫ true, тогда и условие будет ИСТИННЫМ —> выполняется блок If.
Если хотя бы одно из выражений ЛОЖНО false, то и всё условие ЛОЖНО —> выполняется блок Else.

Логический оператор ИЛИ (||)
Если хотя бы одно из выражений в условии ИСТИННО true, тогда и всё условие будет ИСТИННЫМ.
Если все выражения в условии ЛОЖНЫ false, то и всё условие ЛОЖНО.

Отрицание НЕ (!)
Логическое НЕ используется для инверсии логического значения и всегда возвращает true или false.
То есть логическое НЕ возвращает true, если операнд имеет значение false.
И наоборот логическое НЕ возвращает false, если операнд имеет значение true.

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

Для операций над логическими значениями в JavaScript есть || (ИЛИ), && (И) и ! (НЕ).

Хоть они и называются «логическими», но в JavaScript могут применяться к значениям любого типа и возвращают также значения любого типа.

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

|| (ИЛИ)

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

Получается следующая «таблица результатов»:

|| (ИЛИ)

Если значение не логического типа – то оно к нему приводится в целях вычислений. Например, число 1 будет воспринято как true , а 0 – как false :

|| (ИЛИ)

Обычно оператор ИЛИ используется в if , чтобы проверить, выполняется ли хотя бы одно из условий, например:

|| (ИЛИ)

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

|| (ИЛИ)

Короткий цикл вычислений

JavaScript вычисляет несколько ИЛИ слева направо. При этом, чтобы экономить ресурсы, используется так называемый «короткий цикл вычисления».

Допустим, вычисляются несколько ИЛИ подряд: a || b || c || . . Если первый аргумент – true , то результат заведомо будет true (хотя бы одно из значений – true ), и остальные значения игнорируются.

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

При запуске примера ниже присвоение x не произойдёт:

|| (ИЛИ)

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

|| (ИЛИ)

Значение ИЛИ

|| запинается на «правде»,
&& запинается на «лжи».

Итак, как мы видим, оператор ИЛИ вычисляет ровно столько значений, сколько необходимо – до первого true .

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

|| (ИЛИ)

Это используют, в частности, чтобы выбрать первое «истинное» значение из списка:

|| (ИЛИ)

Если все значения «ложные», то || возвратит последнее из них:

|| (ИЛИ)

Итак, оператор || вычисляет операнды слева направо до первого «истинного» и возвращает его, а если все ложные – то последнее значение.

Иначе можно сказать, что " || запинается на правде".

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

|| (ИЛИ)

В классическом программировании И возвращает true , если оба аргумента истинны, а иначе – false :

|| (ИЛИ)

|| (ИЛИ)

Как и в ИЛИ, в И допустимы любые значения:

|| (ИЛИ)

К И применим тот же принцип «короткого цикла вычислений», но немного по-другому, чем к ИЛИ.

Если левый аргумент – false , оператор И возвращает его и заканчивает вычисления. Иначе – вычисляет и возвращает правый аргумент.

|| (ИЛИ)

Можно передать и несколько значений подряд, при этом возвратится первое «ложное» (на котором остановились вычисления), а если его нет – то последнее:

|| (ИЛИ)

Итак, оператор && вычисляет операнды слева направо до первого «ложного» и возвращает его, а если все истинные – то последнее значение.

Иначе можно сказать, что " && запинается на лжи".

Приоритет оператора И && больше, чем ИЛИ || , так что он выполняется раньше.

Поэтому в следующем коде сначала будет вычислено правое И: 1 && 0 = 0 , а уже потом – ИЛИ.

|| (ИЛИ)

Оператор && в простых случаях можно использовать вместо if , например:

|| (ИЛИ)

Действие в правой части && выполнится только в том случае, если до него дойдут вычисления. То есть, alert сработает, если в левой части будет true .

|| (ИЛИ)

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

Оператор НЕ – самый простой. Он получает один аргумент. Синтаксис:

|| (ИЛИ)

  1. Сначала приводит аргумент к логическому типу true/false .
  2. Затем возвращает противоположное значение.

|| (ИЛИ)

В частности, двойное НЕ используют для преобразования значений к логическому типу:

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

В языке программирования JavaScript есть пять логических операторов || (или), && (и), ! (не), менее известный ?? оператор нулевого слияния, который еще относят к частному случаю оператора || (или) и тернарный оператор. Логические операторы используются для комбинирования булевых значений — true (истина) и false (ложь) и часто применяются в сочетании с операторами отношений (>, >=, true либо false .

Если значение равно 0, -0, null, false, NaN, undefined или «» (пустая строка) — результат false . Все остальное, включая строку «false» — результат true .

Остановимся подробнее на операторах || (или), && (и) и ! (не)

Логическое И &&

&& (двой знак амперсанда) — это бинарный оператор, который представляет собой логически «и» и принимает значение true только в том случае, когда оба операнда истинны, в противном случае false .

Рассмотри результат при каждой возможной логической комбинации.

Пример №1

Пример №2

При необходимости можно передать и больше условий && (и)

Пример №3

В качестве операнда && допускаются любые другие значения

Пример №4

В случае, когда операторов && несколько:

  • вычисление идет слева направо;
  • операнды принимают значение true или false ;
  • если операнд false сравнение останавливается, а результат — значение этого операнда;
  • если все значения true , тогда возвращается последний операнд;
  • если возвращаемый операнд не является булевым — результат значение операнда.

Если сказать по другому результат — это значение первого false или последнего операнда.

Пример №5

Приоритет у && (и) выше чем у || (или), таким образом сначала выполнить сравнение в левой и правой части выражения.

Логическое ИЛИ ||

|| (двойная вертикальная черта) — это бинарный оператор, который представляет собой логическое «или» и принимает значение true в том случае, когда все или одно из значений операндов истинно, в противном случае false .

Рассмотри результат при каждой возможной логической комбинации.

Пример №6

Пример №7

При необходимости можно передать и больше условий || (или).

Пример №8

В качестве операнда || допускаются любые другие значения.

Пример №9

В случае, когда операторов || несколько:

  • вычисление идет слева направо;
  • операнды принимают значение true или false ;
  • если операнд true сравнение останавливается, а результат — значение этого операнда;
  • если все значения false , тогда возвращается последний операнд;
  • если возвращаемый операнд не является булевым — результат значение операнда.

Если сказать по другому результат — это значение первого true или последнего операнда.

Пример №10

В результате «сокращенного вычисления» (когда вычисления заканчиваются, если результат уже известен) с помощью || (или), можно реализовывать и такие конструкции. В данном примере это своеобразная замена if , которая может быть удобна в определенных случаях.

Логическое НЕ !

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

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

Эквивалентом такой конструкции служит встроенная функция Boolean

Логически оператор ! имеет более высокий приоритет, нежели || и && , поэтому при необходимости сделать отрицание выражения, конструкцию нужно брать в скобки.

Итого

В данном уроке мы подробно рассмотрели логические операторы:

  • && (и) — возвращает true , когда оба операнда true , в противном случае false ;
  • || (или) — возвращает false , если два операнда false , во всех остальных случаях true ;
  • ! (не) — возвращает true , если значение операнда false и наоборот;

Из этих трех операторов наивысший приоритет исполнения имеет ! (не), затем && (и) и только потом || (или).

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

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

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

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

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

Оператор Обозначение Пример использования Операция
Логическое НЕ (NOT) ! !x true , если x равен false ; или false , если x равен true
Логическое И (AND) && x && y true , если и x ,и y равны true ; в противном случае – false
Логическое ИЛИ (OR) || x || y true , если x или y равен true ; в противном случае – false

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

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

Логическое НЕ (оператор ! )

Операнд Результат
true false
false true

Если операнд логического НЕ вычисляется как true , логическое НЕ вычисляется как false . Если операнд логического НЕ вычисляется как false , логическое НЕ вычисляется как true . Другими словами, логическое НЕ меняет логическое значение с true на false и наоборот.

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

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

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

Но x не больше y , так как же это возможно? Ответ заключается в том, что поскольку оператор логического НЕ имеет более высокий приоритет, чем оператор «больше чем», выражение !x > y фактически вычисляется как (!x) > y . Поскольку x равно 5, !x вычисляется как 0, а 0 > y равно false , поэтому выполняется инструкция else !

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

Таким образом, сначала будет вычислено x > y , а затем логическое НЕ инвертирует логический результат.

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

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

Простое использование логического НЕ, например if (!value) , не требует скобок, потому что приоритет здесь не играет роли.

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

Оператор логического ИЛИ используется для проверки того, выполняется ли одно из двух условий. Если значение левого операнда истинно, или значение правого операнда истинно, или оба значения истинны, то логический оператор ИЛИ возвращает true . В противном случае он вернет false .

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

Левый операнд Правый операнд Результат
false false false
false true true
true false true
true true true

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

В этом случае мы используем логический оператор ИЛИ, чтобы проверить, истинно ли левое условие ( value == 0 ) или правое условие ( value == 1 ). Если одно из них (или оба) истинны, логический оператор ИЛИ принимает значение true , что означает выполнение инструкции if . Если ни одно из них не является истинным, результат логического оператора ИЛИ будет false , что означает выполнение инструкции else .

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

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

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

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

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

Левый операнд Правый операнд Результат
false false false
false true false
true false false
true true true

Например, нам может потребоваться узнать, находится ли значение переменной x в диапазоне от 10 до 20. На самом деле это два условия: нам нужно знать, больше ли x , чем 10, а также меньше ли x , чем 20.

В этом случае мы используем оператор логическое И, чтобы проверить, истинны ли левое условие ( value > 10 ) и правое условие ( value < 20 ). Если оба условия истинны, оператор логическое И принимает значение true , и выполняется инструкция if . Если ни одно из условий или хотя бы одно из них не соответствует истине, оператор логическое И принимает значение false , и выполняется инструкция else .

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

Если все эти условия верны, будет выполнена инструкция if . Если какое-либо из этих условий ложно, будет выполняться инструкция else .

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

Чтобы логическое И возвращало true , оба операнда должны иметь значение true . Если первый операнд вычисляется как false , логическое И знает, что оно должно возвращать false , независимо от того, вычисляется ли второй операнд как true или false . В этом случае оператор логическое И немедленно вернет false , даже не вычисляя второй операнд! Это известно как вычисление по короткой схеме и выполняется в основном в целях оптимизации.

Точно так же, если первый операнд для логического ИЛИ равен true , тогда всё условие ИЛИ должно вычисляться как true , и второй операнд не вычисляется.

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

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

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

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

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

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

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

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

Начинающие программисты часто пишут такие выражения, как value1 || value2 && value3 . Поскольку логическое И имеет более высокий приоритет, это выражение вычисляется как value1 || (value2 && value3) , а не как (value1 || value2) && value3 . Надеюсь, это то, чего хотел программист! Если программист предполагал вычисление слева направо (как это происходит со сложением/вычитанием или умножением/делением), он или она получит не тот результат, который не ожидался!

При смешивании логического И и логического ИЛИ в одном выражении рекомендуется явно заключать в скобки каждый оператор и его операнды. Это помогает предотвратить ошибки приоритета, упрощает чтение кода и четко определяет, как вы рассчитывали вычислять выражение. Например, вместо записи value1 && value2 || value3 && value4 , лучше написать (value1 && value2) || (value3 && value4) .

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

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

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

Многие программисты также ошибаются, полагая, что !(x && y) – это то же самое, что !x && !y . К сожалению, так нельзя «распределять» логическое НЕ.

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

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

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

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

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

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

Левый операнд Правый операнд Результат
false false false
false true true
true false true
true true false

В C++ нет оператора л огическое исключающее ИЛИ . В отличие от логического ИЛИ или логического И, логическое исключающее ИЛИ не может быть вычислено по короткой схеме. По этой причине создание оператора логическое исключающее ИЛИ из операторов логического ИЛИ и логического И является сложной задачей. Однако вы можете легко имитировать логическое исключающее ИЛИ (XOR), используя оператор неравенства ( != ):

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

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

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

Вопрос 1

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

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

означает, что мы вычислили (1 <2 || 3 != 3) , чтобы прийти к (true || [3 != 3]) , и вычислили его, чтобы прийти к true . 3 != 3 никогда не выполнялся из-за вычисления по короткой схеме.

a) (true && true) || false

b) (false && true) || true

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

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

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