Логические операторы (справочник по C#)
Следующие операторы выполняют логические операции с использованием логических операндов:
- Унарный (логическое отрицание) оператор.
- Бинарные (логическое И), (логическое ИЛИ), а также (логическое исключающее ИЛИ) операторы. Эти операторы всегда обрабатывают оба операнда.
- Бинарные (условное логическое И) и (условное логическое ИЛИ) операторы. Эти операторы вычисляют правый операнд, только если это необходимо.
Для операндов целочисленных типов операторы, | и ^ выполняют побитовые логические операции. Дополнительные сведения см. в разделе Побитовые операторы и операторы сдвига.
Оператор логического отрицания !
Унарный префиксный оператор ! выполняет логическое отрицание операнда, возвращая true , если операнд имеет значение false , и false , если операнд имеет значение true .
Начиная с C# 8,0 унарный постфиксный ! оператор является ! .
Оператор логического И &
Оператор & вычисляет логическое И для всех своих операндов. Результат операции x & y принимает значение true , если оба оператора x и y имеют значение true . В противном случае результат будет false .
Оператор & вычисляет оба операнда, даже если левый операнд имеет значение false . При этом операция должна вернуть значение false , независимо от значения правого операнда.
В следующем примере правый операнд оператора & является вызовом метода, который выполняется независимо от значения левого операнда:
Условный логический оператор and также вычисляет логическое и для своих операндов, но не вычисляет правый операнд, если левый операнд принимает false значение.
Для операндов целочисленных типов оператор выдает побитовую логическую операцию и для своих операндов. Унарный & оператор является & .
Оператор логического исключения ИЛИ ^
Оператор ^ вычисляет логическое исключение ИЛИ для всех своих операндов, возвращая true для x ^ y , если x имеет значение true и y имеет значение false или x имеет значение false и y имеет значение true . В противном случае результат будет false . То есть, для bool операндов ^ оператор выдает тот же результат, что и оператор != bool .
Оператор логического ИЛИ |
Оператор | вычисляет логическое ИЛИ для всех своих операндов. Результат операции x | y принимает значение true , если хотя бы один из операторов x или y имеет значение true . В противном случае результат будет false .
Оператор | вычисляет оба операнда, даже если левый операнд имеет значение true . При этом операция должна вернуть значение true , независимо от значения правого операнда.
В следующем примере правый операнд оператора | является вызовом метода, который выполняется независимо от значения левого операнда:
Условный логический оператор or также вычисляет логическое или для своих операндов, но не вычисляет правый операнд, если левый операнд принимает true значение.
Условный оператор логического И &&
Условный оператор логического И && (оператор короткого замыкания) вычисляет логическое И для своих операндов. Результат операции x && y принимает значение true , если оба оператора x и y имеют значение true . В противном случае результат будет false . Если x имеет значение false , y не вычисляется.
В следующем примере правый операнд оператора && является вызовом метода, который не выполняется, если левый операнд имеет значение false :
Логический оператор AND вычисляет логическое и для своих операндов, но всегда вычисляет оба операнда.
Условный оператор логического ИЛИ ||
Условный оператор логического ИЛИ || (оператор короткого замыкания) вычисляет логическое ИЛИ для своих операндов. Результат операции x || y принимает значение true , если хотя бы один из операторов x или y имеет значение true . В противном случае результат будет false . Если x имеет значение true , y не вычисляется.
В следующем примере правый операнд оператора || является вызовом метода, который не выполняется, если левый операнд имеет значение true :
Логический оператор OR вычисляет логическое или для его операндов, но всегда вычисляет оба операнда.
Операторы, допускающие логическое значение NULL
Для операндов bool? операторы bool? и & поддерживают следующую логику с тремя значениями:
Оператор & возвращает true только в том случае, если оба операнда имеют значение true . Если x или y имеет значение false , оператор x & y возвращает false (даже если другой операнд имеет значение null ). В противном случае выражение x & y будет иметь значение null .
Оператор | возвращает false только в том случае, если оба операнда имеют значение false . Если x или y имеет значение true , оператор x | y возвращает true (даже если другой операнд имеет значение null ). В противном случае выражение x | y будет иметь значение null .
Эта семантика описывается в следующей таблице:
x y x&y x | y Да true true true true false false true true null null true false true false true false false false false false null false null null true null true null false false null null null null null
Поведение этих операторов отличается от типичного поведения операторов, допускающих значение NULL. Как правило, оператор, который определяется для операндов типа значения, можно также использовать с соответствующими операндами типа, допускающего значение NULL. Такой оператор возвращает null , если какой-либо из операндов имеет значение null . При этом операторы & и | могут возвращать отличное от NULL значение, даже если один из операндов имеет значение null . См. подробнее о поведении операторов, допускающих значение NULL, в разделе Операторы с нулификацией в статье Типы, допускающие значение NULL.
Вы также можете также использовать операторы ! и ^ с операндами bool? , как показано в следующем примере:
Условные логические операторы && и || не поддерживают операнды типа bool? .
Составное присваивание
Для бинарного оператора op выражение составного присваивания в форме
за исключением того, что x вычисляется только один раз.
Операторы & , | и ^ поддерживают составное присваивание, как показано в следующем примере:
Условные логические операторы && и || не поддерживают составное присваивание.
Приоритет операторов
В следующем списке перечислены логические операторы в порядке убывания приоритета:
- Оператор логического отрицания !
- Оператор логического И &
- Оператор логического исключающего ИЛИ ^
- Оператор логического ИЛИ |
- Условный оператор логического И &&
- Условный оператор логического ИЛИ ||
Порядок вычисления, определяемый приоритетом операторов, можно изменить с помощью скобок ( () ).
Полный список операторов C#, упорядоченный по уровню приоритета, можно найти в разделе Приоритет операторов статьи Операторы C#.
Возможность перегрузки оператора
Определяемый пользователем тип может перегружать операторы, & , | и ^ . При перегрузке бинарного оператора соответствующий оператор составного присваивания также неявно перегружается. Определяемый пользователем тип не может перегружать оператор составного присваивания явным образом.
Определяемый пользователем тип не может перегружать условные логические операторы && и || . Однако если определяемый пользователем тип перегружает операторы true и false и оператор OR | в определенном виде, то && операция или || , соответственно, может быть рассчитана для операндов этого типа. Дополнительные сведения см. в разделе Пользовательские условные логические операторы в Спецификации языка C#.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#: