共用方式為


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

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

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

邏輯否定運算子 !

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

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

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

邏輯 AND 運算子 &

& 運算子會計算其運算元的邏輯 AND。 若 x & ytrue 皆求出 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 ^ y 評估為 truex 評估為 true,或是 y 評估為 falsex 評估為 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

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

邏輯 OR 運算子 |

| 運算子會計算其運算元的邏輯 OR。 若 x | ytrue 其中一項的值為 xy 的結果會是 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。 若 x && ytrue 皆求出 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。 若 x || ytrue 其中一項的值為 xy 的結果會是 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
假的 假的
假的 假的
假的 假的 假的 假的
假的 假的
假的 假的

那些運算子的行為和具有可為 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# 運算子一文的運算子優先順序一節。

運算子是否可多載

使用者定義類型可以多載!&|^ 運算子。 當二元運算子多載時,對應的複合指派運算子也會隱含地多載。 從 C# 14 開始,使用者定義型別可以明確多載複合指派運算符,以提供更有效率的實作。 一般而言,型別會多載這些運算符,因為值可以就地更新,而不是配置新的實例來保存二進位作業的結果。 如果類型未提供明確的多載,編譯程式會產生隱含多載。

使用者定義類型無法多載條件邏輯運算子 &&||。 不過,若使用者定義類型以某種方式多載 True 和 False 運算子以及 &| 運算子,就可以針對該類型的運算元個別評估 &&|| 作業。 如需詳細資訊,請參閱 C# 語言規格使用者定義條件式邏輯運算子一節。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱