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 (&&||).

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 truewartość , 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 & ytrue 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 falsewartość , lub x ocenia false wartość y i y daje w wyniku truewartość . 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 yx zostanie obliczona na truewartość . 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 && ytrue jeśli zarówno x , jak i y ocenić wartość true. W przeciwnym razie wynik to false. Jeśli x wartość zostanie obliczona na falsewartość , 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 yx zostanie obliczona na truewartość . W przeciwnym razie wynik to false. Jeśli x wartość zostanie obliczona na truewartość , 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 & tworzy true tylko wtedy, gdy oba operandy oceniają wartość .true Jeśli element x lub y zwróci wartość false, x & y tworzy false wartość (nawet jeśli inny operand daje wartość null). W przeciwnym razie wynikiem parametru x & y jest null.

  • Operator | tworzy false tylko wtedy, gdy oba operandy oceniają wartość .false Jeśli element x lub y zwróci wartość true, x | y tworzy true wartość (nawet jeśli inny operand daje wartość null). W przeciwnym razie wynikiem parametru x | y jest null.

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 opbinarnego 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#:

Zobacz też