ブール論理演算子 - AND、OR、NOT、XOR
次の論理ブール演算子は、bool オペランドを使って論理演算を実行します。 この演算子には、単項論理否定 (!
)、2 項論理 AND (&
)、OR (|
)、排他的 OR (^
)、2 項条件付き論理 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 免除演算子です。
論理 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
オペランドの場合、^
演算子は非等値演算子 !=
と同じ結果を計算します。
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) 演算子は、次のように 3 値論理をサポートします。
&
演算子は、その両方のオペランドが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 | null | False | null |
null | true | null | true |
null | false | False | null |
null | null | null | null |
これらの演算子の動作は、null 許容値型の一般的な演算子の動作とは異なります。 通常、値型のオペランドに定義されている演算子も、対応する null 値型のオペランドと共に使用できます。 このような演算子では、そのオペランドのいずれかが null
として評価される場合に null
を生成します。 しかし、&
および |
演算子は、オペランドの 1 つが 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?
オペランドをサポートしません。
複合代入。
2 項演算子 op
の場合、フォームの複合代入式
x op= y
上記の式は、次の式と同じです。
x = x op y
ただし、x
が評価されるのは 1 回だけです。
次の例に示すように、&
、|
、および ^
演算子は複合代入をサポートします。
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# 演算子に関する記事の「演算子の優先順位」セクションを参照してください。
演算子のオーバーロード可/不可
ユーザー定義型は、!
、&
、|
、および ^
演算子をオーバーロードできます。 2 項演算子をオーバーロードすると、対応する複合代入演算子も暗黙的にオーバーロードされます。 ユーザー定義型では、複合代入演算子を明示的にオーバーロードすることはできません。
ユーザー定義型は条件付き論理演算子 &&
と ||
をオーバーロードできません。 ただし、ユーザー定義型が true および false 演算子と &
または |
演算子を特定の方法でオーバーロードしている場合は、その型のオペランドに対してそれぞれ &&
または ||
演算の評価が可能になります。 詳細については、「C# 言語仕様」のユーザー定義型条件論理演算子に関するセクションを参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
関連項目
.NET