布林值邏輯運算子 (C# 參考)
下列運算子會使用 bool 運算元執行邏輯作業:
- 一元 (邏輯否定) 運算子。
- 二元 (邏輯 AND) 、 (邏輯 OR) ,以及 (邏輯專有或) 運算子。 那些運算子一律會評估兩個運算元。
- 二元 (條件式邏輯 AND) 和 (條件式邏輯 OR) 運算子。 那些運算子只會在必要時才評估右邊的運算元。
針對 整數數數值型別的運算元, 、 |
和 ^
運算子會執行位邏輯運算。 如需詳細資訊,請參閱位元與移位運算子。
邏輯否定運算子 !
一元前置 !
運算子會計算其運算元的邏輯否定。 也就是說,它會在運算元評估為 false
時產生 true
,並在運算元評估為 true
時產生 false
:
bool passed = false;
Console.WriteLine(!passed); // output: True
Console.WriteLine(!true); // output: False
從 c # 8.0 開始,一元 !
後置運算子是 !
。
邏輯 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 。 一元的 &
運算子是 &
。
邏輯互斥 OR 運算子 ^
^
運算子會計算其運算元的邏輯互斥 OR,其也稱為邏輯 XOR。 如果 x
評估為 true
且 y
評估為 false
,或是 x
評估為 false
且 y
評估為 true
時,x ^ y
的結果將會為 true
。 否則,結果為 false
。 也就是說,針對 bool
運算元, ^
運算子會計算與不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?
運算元, bool?
和&
運算子支援三值邏輯,如下所示:
只有當運算子的運算元評估為
true
時,&
才會產生true
運算子。x
如果或y
評估為false
,即使另一個運算元評估為null
) ,x & y
也會產生false
(。 否則,的結果x & y
為null
。只有當運算子的運算元評估為
false
時,|
才會產生false
運算子。x
如果或y
評估為true
,即使另一個運算元評估為null
) ,x | y
也會產生true
(。 否則,的結果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# 語言規格的下列幾節: