布林值邏輯運算子:AND, OR, NOT, XOR
邏輯布林值運算子會使用 bool 運算元執行邏輯運算。 運算子包含一元邏輯否定 (!
)、二進位邏輯 AND (&
)、OR (|
) 和互斥 OR (^
) 和二進位條件式邏輯 AND (&&
) 和 OR (||
)。
- 一元
!
(邏輯否定) 運算子。 - 二元
&
(邏輯 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。 若 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
評估為 true
且 y
評估為 false
,或是 x
評估為 false
且 y
評估為 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。 若 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 |
---|---|---|---|
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# 語言規格的下列幾節: