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

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

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

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

邏輯否定運算子 !

一元前綴 ! 運算子計算其運算元的邏輯否定。 若運算數值true為 ,則產生 false ,若false運算數值為 true:

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

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

邏輯 AND 運算子 &

& 運算子會計算其運算元的邏輯 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

條件邏輯 AND 運算&&子也會計算其運算元的邏輯 AND,但若左操作數為 false,則不評估右側運算元 。

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

邏輯互斥 OR 運算子 ^

^ 運算子會計算其運算元的邏輯互斥 OR,其也稱為邏輯 XOR。 如果 x ^ y 是 true 且 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

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

邏輯 OR 運算子 |

| 運算子會計算其運算元的邏輯 OR。 若 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

條件邏輯 OR 運算||子也會計算其運算元的邏輯 OR,但若左側運算元值為 true,則不評估右側運算元。

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

條件邏輯 AND 運算子 &&

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

邏輯 AND 運算&子也會計算其運算元的邏輯 AND,但它總是同時評估兩個運算元。

條件邏輯 OR 運算子 ||

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

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

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

對於 bool? 運算元, & (邏輯 AND) 和 | (邏輯 OR) 運算子支援以下三值邏輯:

  • 只有當其兩個運算元都值為 &時,運算true子才返回true。 若 x 或 評估為 y,則false返回x & y(即使其他運算元評估為 falsenull )。 否則 x & y 的結果為 null。

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

下列表格呈現該語意:

x y x 和 y x |y
是 是 是 是
是 假的 假的 是
是 null null 是
假的 是 假的 是
假的 假的 假的 假的
假的 null 假的 null
null 是 null 是
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# 運算子一文的運算子優先順序一節。

運算子是否可多載

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

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

C# 語言規格

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

另請參閱