Как сделать или в c

Обновлено: 06.07.2024

Обзор типа данных Boolean

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

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

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

Эквивалентность или равенство - данный оператор является бинарным оператором, он работает над двумя значениями или операндами. Оператор equivalence сравнивает два операнда и возвращает логическое значение, указывающее, совпадают ли они точно. Символом оператора для эквивалентности является знак двойного равенства (==).

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

Оператор неравенства сравнивает два операнда и возвращает true, если два значения различны. Оператор предоставляет оператору эквивалентности противоположную функциональность. Символ оператора - восклицательный знак и знак равенства (!=). Это читается как "не равно".

Оператор NOT

Оператор NOT является унарным оператором, так как действует на один операнд. Оператор NOT инвертирует значение логического значения. Если исходное значение true, то возвращаемое значение false; если исходное значение false, возвращаемое значение true. Операцию иногда называют двоичным дополнением.

Оператор AND

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


Оператор AND представлен символом амперсанда

OR оператор

OR используется, чтобы сравнить два значения типа boolean. Оператор OR возвращает значение true, если один из операндов имеет значение true. Это может быть представлено следующей таблицей:


Оператор OR представлен символом бара (|)

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

Ниже перечислены операторы отношения:

Результатом выполнения оператора отношения или логического оператора является логическое значение типа bool.

Рассмотрим пример программы, демонстрирующий применение операторов отношения и логических операторов:

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

Операция импликации может быть построена на основе комбинации логических операторов ! и |:

Укороченные логические операторы

Укороченная логическая операция И выполняется с помощью оператора &&, а укороченная логическая операция ИЛИ — с помощью оператора ||. Этим укороченным логическим операторам соответствуют обычные логические операторы & и |. Единственное отличие укороченного логического оператора от обычного заключается в том, что второй его операнд вычисляется только по мере необходимости.

Укороченные логические операторы иногда оказываются более эффективными, чем их обычные аналоги. Так зачем же нужны обычные логические операторы И и ИЛИ? Дело в том, что в некоторых случаях требуется вычислять оба операнда логической операции И либо ИЛИ из-за возникающих побочных эффектов. Пример:

Введение

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

Ошибки с использованием оператора '||'

Выражение != || !=

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

Далее представлена таблица истинности для этого примера кода:


Теперь посмотрим на реальный пример ошибки, найденной в проекте LibreOffice.

V547 Expression is always true. Probably the '&&' operator should be used here. sbxmod.cxx 1777

Выражение == || !=

Синтетический пример, в котором результат всего условного выражения не зависит от результата подвыражения (err == code1):

Далее представлена таблица истинности для этого примера кода:


Теперь посмотрим на реальный пример ошибки, найденной в проекте FreeBSD.

V590 Consider inspecting the 'error == 0 || error != — 1' expression. The expression is excessive or contains a misprint. nd6.c 2119

Не сильно он отличается от синтетического примера, не правда ли?

Ошибки с использованием оператора '&&'

Выражение == && ==

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

Далее представлена таблица истинности для этого примера кода:


Теперь посмотрим на реальный пример ошибки, найденной в проекте SeriousEngine.

V547 Expression is always false. Probably the '||' operator should be used here. entity.cpp 3537

Выражение == && !=

Далее представлена таблица истинности для этого примера кода:


Теперь посмотрим на реальный пример ошибки, найденной в проекте ChakraCore — JavaScript-движке для Microsoft Edge.

V590 Consider inspecting the 'sub[i] != '-' && sub[i] == '/'' expression. The expression is excessive or contains a misprint. rl.cpp 1388

Ошибки с использованием оператора '?:'

V502 Perhaps the '?:' operator works in a different way than it was expected. The '?:' operator has a lower priority than the '|' operator. ata-serverworks.c 166

Заключение

Описанные шаблоны условных выражений могут нести большую опасность, если не проявлять повышенную внимательность при написании кода. Несмотря на небольшое количество операторов, всё условное выражение может пониматься неправильно. Код, в котором допустили такую ошибку, может выглядеть вполне логичным и будет пропущен после code-review. Подстраховать себя от таких ошибок можно путём проверки своего кода с помощью построения таблиц истинности, если есть сомнения в правильности условия, а также с помощью регулярных проверок статическими анализаторами.



Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Svyatoslav Razmyslov. Logical Expressions in C/C++. Mistakes Made by Professionals .

в абсолютно любой книге по с/с++ в первых главах, где описываются арифметические и логические операции. >> называется "оператор сдвига влево". называется "оператор сдвига вправо". ^ называется "исключающее или". Если в книге этого нет, выкидывайте такую книгу.

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

А еще операторы сдвига в С++ являются перегруженными операторами для некоторых классов. Например для cout и cin и позволяют делать ввод-вывод более "человечным".

К примеру конструкция 1 очень популярна, если нужно получать степени двойки (очень быстро). 1 , 1 .

Читайте также: