ブール論理演算子 - AND、OR、NOT、XOR

次の論理ブール演算子は、bool オペランドを使って論理演算を実行します。 この演算子には、単項論理否定 (!)、2 項論理 AND (&)、OR (|)、排他的 OR (^)、2 項条件付き論理 AND (&&)、OR (||) が含まれます。

整数の数値型のオペランドの場合、&|^ 演算子でビットごとの論理演算を実行します。 詳しくは、「ビットごとの演算子とシフト演算子」をご覧ください。

論理否定演算子 !

単項の接頭辞 ! 演算子では、そのオペランドの論理否定が計算されます。 つまり、オペランドが false と評価された場合は true、オペランドが true と評価された場合は false が生成されます。

bool passed = false;
Console.WriteLine(!passed);  // output: True
Console.WriteLine(!true);    // output: False

単項後置の ! 演算子は null 免除演算子です。

論理 AND 演算子 &

& 演算子がそのオペランドの論理 AND を計算します。 xy の両方が 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 とも呼ばれます) を計算します。 xtrue に評価され、yfalse に評価された場合、または xfalse に評価され、ytrue に評価された場合、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 を計算します。 xy の両方が true と評価されれば、x && y の結果は true です。 それ以外の場合、結果は false です。 xfalse に評価される場合、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 です。 xtrue に評価される場合、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 & yfalse を生成します。 それ以外の場合、x & y の結果は null になります。

  • | 演算子は、その両方のオペランドが false に評価される場合にのみ false を生成します。 x または y のいずれかが true に評価される場合、(もう一方のオペランドが null に評価された場合でも) x | ytrue を生成します。 それ以外の場合、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# 言語仕様」の次のセクションを参照してください。

関連項目