Operatory logiczne — AND, OR, NOT, XOR
Operatory logiczne logiczne wykonują operacje logiczne z operandami logicznymi . Operatory obejmują jednoargumentową negację logiczną (!
), binarną wartość AND (), OR (&
|
) i wyłączną or (^
) oraz binarny warunkowy logiczny AND () i OR (&&
||
).
- Operator jednoargumentowy
!
(negacja logiczna). - Operatory binarne
&
(logiczne AND),(|
logiczne OR)i^
(logiczne wyłączne OR). Te operatory zawsze oceniają oba operandy. - Operatory binarne
&&
(warunkowe logiczne AND) i||
(warunkowe logiczne OR). Operatorzy ci oceniają operand prawy tylko wtedy, gdy jest to konieczne.
W przypadku operandów typów&
liczb całkowitych operatory , |
i ^
wykonują operacje logiczne bitowe. Aby uzyskać więcej informacji, zobacz Operatory bitowe i shift.
Operator negacji logicznej !
Operator prefiksu !
jednoargumentowego oblicza logiczne negację operandu. Oznacza to, że generuje true
wartość , jeśli argument operand zwróci wartość false
, i false
, jeśli argument operand zwróci wartość true
:
bool passed = false;
Console.WriteLine(!passed); // output: True
Console.WriteLine(!true); // output: False
Operator jednoargumentowego postfiksu !
jest operatorem forgiving o wartości null.
Operator logiczny AND i
Operator &
oblicza logiczne and jego operandy. Wynik jest, x & y
true
jeśli zarówno x
, jak i y
ocenić wartość true
. W przeciwnym razie wynik to false
.
Operator &
zawsze ocenia oba operandy. Gdy operand po lewej stronie zwróci wartość false
, wynik operacji jest false
niezależnie od wartości operandu po prawej stronie. Jednak nawet wtedy operand po prawej stronie jest oceniany.
W poniższym przykładzie operand &
po prawej stronie operatora jest wywołaniem metody, które jest wykonywane niezależnie od wartości operandu po lewej stronie:
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
Warunkowy operator logiczny AND oblicza również logiczny operator AND &&
jego operandów, ale nie ocenia operandu po prawej stronie, jeśli operand po lewej stronie oblicza wartość false
.
W przypadku operandów typów&
liczb całkowitych operator oblicza bitową wartość logiczną AND swoich operandów. Operator jednoargumentowy &
jest operatorem address-of.
Logiczny wyłączny operator OR ^
Operator ^
oblicza logiczny wyłączny or, znany również jako logiczny XOR, jego operandów. Wynik x ^ y
jest, true
jeśli x
ocenia true
i ocenia false
wartość , lub x
ocenia false
wartość y
i y
daje w wyniku true
wartość . W przeciwnym razie wynik to false
. Oznacza to, że w przypadku bool
operandów ^
operator oblicza ten sam wynik co operator !=
nierówności .
Console.WriteLine(true ^ true); // output: False
Console.WriteLine(true ^ false); // output: True
Console.WriteLine(false ^ true); // output: True
Console.WriteLine(false ^ false); // output: False
W przypadku operandów typów^
liczb całkowitych operator oblicza bitowo logiczne wyłączność OR jego operandów.
Operator logiczny OR |
Operator |
oblicza logiczne OR jego operandów. x | y
Wynikiem polecenia jest true
, jeśli wartość lub y
x
zostanie obliczona na true
wartość . W przeciwnym razie wynik to false
.
Operator |
zawsze ocenia oba operandy. Gdy operand po lewej stronie zwróci wartość true
, wynik operacji jest true
niezależnie od wartości operandu po prawej stronie. Jednak nawet wtedy operand po prawej stronie jest oceniany.
W poniższym przykładzie operand |
po prawej stronie operatora jest wywołaniem metody, które jest wykonywane niezależnie od wartości operandu po lewej stronie:
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
Warunkowy operator logiczny OR ||
oblicza również logiczny argument OR jego operandów, ale nie ocenia operandu po prawej stronie, jeśli operand po lewej stronie oblicza wartość true
.
W przypadku operandów typów|
liczb całkowitych operator oblicza bitową wartość logiczną OR swoich operandów.
Warunkowy operator LOGICZNY AND &&
Warunkowy operator &&
logiczny AND , znany również jako operator logiczny AND "zwariowania", oblicza logiczne AND jego operandów. Wynik jest, x && y
true
jeśli zarówno x
, jak i y
ocenić wartość true
. W przeciwnym razie wynik to false
. Jeśli x
wartość zostanie obliczona na false
wartość , y
nie zostanie obliczona.
W poniższym przykładzie operand &&
po prawej stronie operatora jest wywołaniem metody, które nie jest wykonywane, jeśli operand po lewej stronie daje wartość 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
Operator logiczny AND &
oblicza również logiczną wartość AND jego operandów, ale zawsze oblicza oba operandy.
Warunkowy operator logiczny OR ||
Warunkowy operator ||
logiczny OR , znany również jako operator logiczny OR "zwarciowy", oblicza logiczne OR jego operandy. x || y
Wynikiem polecenia jest true
, jeśli wartość lub y
x
zostanie obliczona na true
wartość . W przeciwnym razie wynik to false
. Jeśli x
wartość zostanie obliczona na true
wartość , y
nie zostanie obliczona.
W poniższym przykładzie operand ||
po prawej stronie operatora jest wywołaniem metody, które nie jest wykonywane, jeśli operand po lewej stronie daje wartość 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
Operator logiczny OR |
oblicza również logiczne OR jego operandy, ale zawsze ocenia oba operandy.
Operatory logiczne dopuszczane do wartości null
W przypadku bool?
operandów operatory &
(logiczne AND) i|
(logiczne OR) obsługują logikę z trzema wartościami w następujący sposób:
Operator
&
tworzytrue
tylko wtedy, gdy oba operandy oceniają wartość .true
Jeśli elementx
luby
zwróci wartośćfalse
,x & y
tworzyfalse
wartość (nawet jeśli inny operand daje wartośćnull
). W przeciwnym razie wynikiem parametrux & y
jestnull
.Operator
|
tworzyfalse
tylko wtedy, gdy oba operandy oceniają wartość .false
Jeśli elementx
luby
zwróci wartośćtrue
,x | y
tworzytrue
wartość (nawet jeśli inny operand daje wartośćnull
). W przeciwnym razie wynikiem parametrux | y
jestnull
.
W poniższej tabeli przedstawiono semantykę:
x | t | x&y | x|y |
---|---|---|---|
prawda | prawda | prawda | prawda |
prawda | fałsz | fałsz | prawda |
prawda | null | null | prawda |
fałsz | prawda | fałsz | prawda |
fałsz | fałsz | fałsz | fałsz |
fałsz | null | fałsz | null |
null | prawda | null | prawda |
null | fałsz | fałsz | null |
null | null | null | null |
Zachowanie tych operatorów różni się od typowego zachowania operatora z typami wartości dopuszczających wartość null. Zazwyczaj operator zdefiniowany dla operandów typu wartości może być również używany z operandami odpowiedniego typu wartości dopuszczających wartość null. Taki operator generuje null
, jeśli którykolwiek z jego operandów daje wartość null
. &
Operatory i |
mogą jednak generować wartości inne niż null, nawet jeśli jeden z operandów zwróci wartość null
. Aby uzyskać więcej informacji na temat zachowania operatora z typami wartości dopuszczanych do wartości null, zobacz sekcję Operatory zniesione w artykule Typy wartości dopuszczanych do wartości null.
Można również użyć !
operatorów i ^
z bool?
operandami, jak pokazano w poniższym przykładzie:
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());
Warunkowe operatory &&
logiczne i ||
nie obsługują bool?
operandów.
Przypisanie złożone
Dla operatora op
binarnego wyrażenie przypisania złożonego formularza
x op= y
jest równoważny
x = x op y
z wyjątkiem tego, że x
jest obliczany tylko raz.
Operatory &
, |
i ^
obsługują przypisanie złożone, jak pokazano w poniższym przykładzie:
bool test = true;
test &= false;
Console.WriteLine(test); // output: False
test |= true;
Console.WriteLine(test); // output: True
test ^= false;
Console.WriteLine(test); // output: True
Uwaga
Warunkowe operatory &&
logiczne i ||
nie obsługują przypisania złożonego.
Kolejność wykonywania działań
Poniższa lista porządkuje operatory logiczne rozpoczynające się od najwyższego pierwszeństwa do najniższego:
- Operator negacji logicznej
!
- Operator logiczny AND
&
- Logiczny wyłączny operator OR
^
- Operator logiczny OR
|
- Warunkowy operator LOGICZNY AND
&&
- Warunkowy operator logiczny OR
||
Użyj nawiasów, ()
, aby zmienić kolejność oceny narzuconej przez pierwszeństwo operatora:
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
Aby uzyskać pełną listę operatorów języka C# uporządkowanych według poziomu pierwszeństwa, zobacz sekcję Pierwszeństwo operatora w artykule Operatory języka C#.
Przeciążenie operatora
Typ zdefiniowany przez użytkownika może przeciążać !
operatory , &
, |
i ^
. Gdy operator binarny jest przeciążony, odpowiedni operator przypisania złożonego jest również niejawnie przeciążony. Typ zdefiniowany przez użytkownika nie może jawnie przeciążyć operatora przypisania złożonego.
Typ zdefiniowany przez użytkownika nie może przeciążać warunkowych operatorów &&
logicznych i ||
. Jeśli jednak typ zdefiniowany przez użytkownika przeciąża operatory true i false oraz &
operator or |
w określony sposób, &&
operację lub ||
, odpowiednio, można ocenić dla operandów tego typu. Aby uzyskać więcej informacji, zobacz sekcję Operatory logiczne warunkowe zdefiniowane przez użytkownika w specyfikacji języka C#.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#: