Логические операторы — AND, OR, NOT, XOR
Логические логические операторы выполняют логические операции с логическими операндами. Операторы включают унарное логическое отрицание (!
), двоичное логическое И (), OR (&
|
) и монопольное ИЛИ (^
), а также двоичный условный логический и () и OR (&&
||
).
- Унарный
!
(логическое отрицание) оператор. - Бинарные
&
(логическое И),|
(логическое ИЛИ), а также^
(логическое исключающее ИЛИ) операторы. Эти операторы всегда обрабатывают оба операнда. - Бинарные
&&
(условное логическое И) и||
(условное логическое ИЛИ) операторы. Эти операторы вычисляют правый операнд, только если это необходимо.
Для операндов целочисленных типов операторы &
, |
и ^
выполняют побитовые логические операции. Дополнительные сведения см. в разделе Побитовые операторы и операторы сдвига.
Оператор логического отрицания !
Унарный префиксный оператор !
выполняет логическое отрицание операнда, возвращая true
, если операнд имеет значение false
, и false
, если операнд имеет значение true
.
bool passed = false;
Console.WriteLine(!passed); // output: True
Console.WriteLine(!true); // output: False
Унарный оператор постфикса !
является оператором, допускающим значение NULL.
Логический оператор AND &
Оператор &
вычисляет логическое И для всех своих операндов. Результат операции x & y
принимает значение true
, если оба оператора x
и y
имеют значение true
. В противном случае результат будет false
.
Оператор &
всегда вычисляет оба операнда. При оценке false
левого операнда результат false
операции независимо от значения правого операнда. Однако, даже тогда, правый операнд оценивается.
В следующем примере правый операнд оператора &
является вызовом метода, который выполняется независимо от значения левого операнда:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = false & SecondOperand();
Console.WriteLine(a);
// Output:
// Second operand is evaluated.
// False
bool b = true & SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
Условный оператор логического И &&
также вычисляет логическое И для своих операндов, но не вычисляет правый операнд, если левый операнд имеет значение false
.
Для операндов целочисленных типов оператор &
вычисляет побитовое логическое И своих операндов. Унарный оператор &
является оператором AddressOf.
Оператор логического исключения ИЛИ ^
Оператор ^
вычисляет логическое исключение ИЛИ для всех своих операндов, возвращая true
для x ^ y
, если x
имеет значение true
и y
имеет значение false
или x
имеет значение false
и y
имеет значение true
. В противном случае результат будет false
. То есть для операндов bool
оператор ^
возвращает тот же результат, что и оператор неравенства !=
.
Console.WriteLine(true ^ true); // output: False
Console.WriteLine(true ^ false); // output: True
Console.WriteLine(false ^ true); // output: True
Console.WriteLine(false ^ false); // output: False
Для операндов целочисленных типов оператор ^
вычисляет побитовое исключающее ИЛИ своих операндов.
Оператор логического ИЛИ |
Оператор |
вычисляет логическое ИЛИ для всех своих операндов. Результат операции x | y
принимает значение true
, если хотя бы один из операторов x
или y
имеет значение true
. В противном случае результат будет false
.
Оператор |
всегда вычисляет оба операнда. При оценке true
левого операнда результат true
операции независимо от значения правого операнда. Однако, даже тогда, правый операнд оценивается.
В следующем примере правый операнд оператора |
является вызовом метода, который выполняется независимо от значения левого операнда:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = true | SecondOperand();
Console.WriteLine(a);
// Output:
// Second operand is evaluated.
// True
bool b = false | SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
Условный оператор логического ИЛИ ||
также вычисляет логическое ИЛИ для своих операндов, но не вычисляет правый операнд, если левый операнд имеет значение true
.
Для операндов целочисленных типов оператор |
вычисляет побитовое логическое ИЛИ своих операндов.
Условный логический оператор AND &>
Условный оператор логического И &&
(оператор короткого замыкания) вычисляет логическое И для своих операндов. Результат операции x && y
принимает значение true
, если оба оператора x
и y
имеют значение true
. В противном случае результат будет false
. Если x
вычисляется false
значение , y
не вычисляется.
В следующем примере правый операнд оператора &&
является вызовом метода, который не выполняется, если левый операнд имеет значение false
:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = false && SecondOperand();
Console.WriteLine(a);
// Output:
// False
bool b = true && SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
Оператор логического И &
также вычисляет логическое И для своих операндов, но он всегда вычисляет оба операнда.
Условный оператор логического ИЛИ ||
Условный оператор логического ИЛИ ||
(оператор короткого замыкания) вычисляет логическое ИЛИ для своих операндов. Результат операции x || y
принимает значение true
, если хотя бы один из операторов x
или y
имеет значение true
. В противном случае результат будет false
. Если x
вычисляется true
значение , y
не вычисляется.
В следующем примере правый операнд оператора ||
является вызовом метода, который не выполняется, если левый операнд имеет значение true
:
bool SecondOperand()
{
Console.WriteLine("Second operand is evaluated.");
return true;
}
bool a = true || SecondOperand();
Console.WriteLine(a);
// Output:
// True
bool b = false || SecondOperand();
Console.WriteLine(b);
// Output:
// Second operand is evaluated.
// True
Оператор логического ИЛИ |
также вычисляет логическое ИЛИ для своих операндов, но всегда вычисляет оба операнда.
Операторы, допускающие логическое значение NULL
Для операндов 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 | г | x&y | x|y |
---|---|---|---|
true | 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? test = null;
Display(!test); // output: null
Display(test ^ false); // output: null
Display(test ^ null); // output: null
Display(true ^ null); // output: null
void Display(bool? b) => Console.WriteLine(b is null ? "null" : b.Value.ToString());
Условные логические операторы &&
и ||
не поддерживают операнды типа bool?
.
Составное присваивание
Для бинарного оператора op
выражение составного присваивания в форме
x op= y
эквивалентно правилу
x = x op y
за исключением того, что x
вычисляется только один раз.
Операторы &
, |
и ^
поддерживают составное присваивание, как показано в следующем примере:
bool test = true;
test &= false;
Console.WriteLine(test); // output: False
test |= true;
Console.WriteLine(test); // output: True
test ^= false;
Console.WriteLine(test); // output: True
Примечание.
Условные логические операторы &&
и ||
не поддерживают составное присваивание.
Приоритет операторов
В следующем списке перечислены логические операторы в порядке убывания приоритета:
- Оператор логического отрицания.
!
- Оператор логического И
&
- Оператор логического исключающего ИЛИ
^
- Оператор логического ИЛИ
|
- Условный оператор логического И
&&
- Условный оператор логического ИЛИ
||
Порядок вычисления, определяемый приоритетом операторов, можно изменить с помощью скобок (()
).
Console.WriteLine(true | true & false); // output: True
Console.WriteLine((true | true) & false); // output: False
bool Operand(string name, bool value)
{
Console.WriteLine($"Operand {name} is evaluated.");
return value;
}
var byDefaultPrecedence = Operand("A", true) || Operand("B", true) && Operand("C", false);
Console.WriteLine(byDefaultPrecedence);
// Output:
// Operand A is evaluated.
// True
var changedOrder = (Operand("A", true) || Operand("B", true)) && Operand("C", false);
Console.WriteLine(changedOrder);
// Output:
// Operand A is evaluated.
// Operand C is evaluated.
// False
Полный список операторов C#, упорядоченный по уровню приоритета, можно найти в разделе Приоритет операторов статьи Операторы C#.
Возможность перегрузки оператора
Определяемый пользователем тип может перегружать операторы !
, &
, |
и ^
. При перегрузке бинарного оператора соответствующий оператор составного присваивания также неявно перегружается. Явная перегрузка составного оператора присваивания для пользовательского типа невозможна.
Определяемый пользователем тип не может перегружать условные логические операторы &&
и ||
. При этом, если определяемый пользователем тип каким-либо образом перегружает операторы true и false и операторы &
и |
, операция &&
или ||
может быть применена для операндов этого типа. Дополнительные сведения см. в разделе Пользовательские условные логические операторы в Спецификации языка C#.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
- Оператор логического отрицания
- Логические операторы
- Условные логические операторы
- Составное присваивание