邏輯布林值運算子會使用 bool 運算元執行邏輯運算。 運算子包含一元邏輯否定 (!)、二進位邏輯 AND (&)、OR (|) 和互斥 OR (^) 和二進位條件式邏輯 AND (&&) 和 OR (||)。
- 一元
!(邏輯否定) 運算子。 - 二元
&(邏輯 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 & 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會產生false(即使其他運算元評估為null)。 否則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實質型別之運算子行為的詳細資訊,請參閱 [可為 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# 語言規格的下列幾節: