次の方法で共有


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

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

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

論理否定演算子 !

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

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

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

論理 AND 演算子 &

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

  • | 演算子は、その両方のオペランドが false に評価される場合にのみ false を生成します。 x または y のいずれかが true に評価される場合、(もう一方のオペランドが x | y に評価された場合でも) truenull を生成します。 それ以外の場合、x | y の結果は null になります。

そのセマンティクスを次の表に示します。

x y x & y x |y
ほんとう ほんとう ほんとう ほんとう
ほんとう 偽り 偽り ほんとう
ほんとう null 値 null 値 ほんとう
偽り ほんとう 偽り ほんとう
偽り 偽り 偽り 偽り
偽り null 値 偽り null 値
null 値 ほんとう null 値 ほんとう
null 値 偽り 偽り 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 項演算子をオーバーロードすると、対応する複合代入演算子も暗黙的にオーバーロードされます。 C# 14 以降では、ユーザー定義型は複合代入演算子を明示的にオーバーロードして、より効率的な実装を提供できます。 通常、型は、バイナリ演算の結果を保持するために新しいインスタンスを割り当てるのではなく、値をその場で更新できるために、これらの演算子をオーバーロードします。 型が明示的なオーバーロードを提供しない場合、コンパイラは暗黙的なオーバーロードを生成します。

ユーザー定義型は条件付き論理演算子 &&|| をオーバーロードできません。 ただし、ユーザー定義型が true および false 演算子& または | 演算子を特定の方法でオーバーロードしている場合は、その型のオペランドに対してそれぞれ && または || 演算の評価が可能になります。 詳細については、「C# 言語仕様」のユーザー定義型条件論理演算子に関するセクションを参照してください。

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

関連項目