ブール論理演算子 (C# リファレンス)
次の演算子は、bool オペランドを使用して論理演算を実行します。
- 単項 (論理否定) 演算子。
- 二項 (論理 AND)、 (論理 OR)、および (論理排他的 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? 演算子および & 演算子は、次のように 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 | false | 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# 言語仕様」の次のセクションを参照してください。