布林值邏輯運算子:AND, OR, NOT, XOR

邏輯布林值運算子會使用 bool 運算元執行邏輯運算。 運算子包含一元邏輯否定 (!)、二進位邏輯 AND (&)、OR (|) 和互斥 OR (^) 和二進位條件式邏輯 AND (&&) 和 OR (||)。

針對整數型別的運算元,&|^ 運算子都會執行位元邏輯運算。 如需詳細資訊,請參閱位元與移位運算子

邏輯否定運算子 !

一元前綴 ! 運算子計算其運算元的邏輯否定。 也就是說,它會在運算元評估為 false 時產生 true,並在運算元評估為 true 時產生 false

bool passed = false;
Console.WriteLine(!passed);  // output: True
Console.WriteLine(!true);    // output: False

一元後綴 ! 運算子是 null-forgiving 運算子

邏輯 AND 運算子 &

& 運算子會計算其運算元的邏輯 AND。 若 xy 皆求出 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

條件邏輯 AND 運算子&& 也會計算其運算元的邏輯 AND,但如果右邊運算元的值評估為 false,系統便不會評估左邊運算元。

針對整數型別的運算元,& 運算子會計算其運算元的 位元邏輯 AND。 一元的 & 運算子是 address-of 運算子

邏輯互斥 OR 運算子 ^

^ 運算子會計算其運算元的邏輯互斥 OR,其也稱為邏輯 XOR。 如果 x 評估為 truey 評估為 false,或是 x 評估為 falsey 評估為 true 時,x ^ 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

針對整數型別的運算元,^ 運算子會計算其運算元的位元邏輯互斥 OR

邏輯 OR 運算子 |

| 運算子會計算其運算元的邏輯 OR。 若 xy 其中一項的值為 truex | 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

條件式邏輯 OR 運算子|| 也會計算其運算元的邏輯 OR,但如果左邊運算元的值評估為 true,系統便不會評估右邊運算元。

針對整數型別的運算元,| 運算子會計算其運算元的 位元邏輯 OR

條件式邏輯 AND 運算子 &&

條件邏輯 AND 運算子 &&,也稱為「捷徑運算」邏輯 AND 運算子,會計算其運算元的邏輯 AND。 若 xy 皆求出 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

邏輯 AND 運算子& 也會計算其運算元的邏輯 AND,但一律會求兩個運算元的值。

條件邏輯 OR 運算子 ||

條件邏輯 OR 運算子 ||,也稱為「捷徑運算」邏輯 OR 運算子,會計算其運算元的邏輯 OR。 若 xy 其中一項的值為 truex || 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

邏輯 OR 運算子| 也會計算其運算元的邏輯 OR,但一律會求兩個運算元的值。

可為 Null 的布林值邏輯運算子

針對 bool? 運算元,& (邏輯 AND)| (邏輯 OR) 運算子會支援三值型邏輯,如下所示:

  • 僅在其兩個運算元評估為 true 時,& 運算子才會產生 true。 如果 xy 評估為 false,則 x & y 會產生 false (即使其他運算元評估為 null)。 否則 x & y 的結果為 null

  • 僅在其兩個運算元評估為 false 時,| 運算子才會產生 false。 如果 xy 評估為 true,則 x | y 會產生 true (即使其他運算元評估為 null)。 否則 x | y 的結果為 null

下列表格呈現該語意:

x y 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

注意

條件邏輯運算子 &&|| 不支援複合指派。

運算子優先順序

下列清單會依優先順序將邏輯運算子排序 (從最高到最低):

  • 邏輯否定運算子 !
  • 邏輯 AND 運算子 &
  • 邏輯互斥 OR 運算子 ^
  • 邏輯 OR 運算子 |
  • 條件邏輯 AND 運算子 &&
  • 條件邏輯 OR 運算子 ||

使用括號 () 來變更由運算子優先順序所強制執行的評估順序:

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# 語言規格的下列幾節:

另請參閱