다음을 통해 공유


부울 논리 연산자 - AND, OR, NOT, XOR

논리 부울 연산자는 bool 피연산자를 사용하여 논리 연산을 수행합니다. 연산자에는 단항 논리 부정(!), 이진 논리 AND(&), OR(|), 배타적 OR(^), 이진 조건부 논리 AND(&&) 및 OR(||)가 포함됩니다.

정수 형식 피연산자의 경우 &, |^ 연산자는 비트 논리 작업을 수행합니다. 자세한 내용은 비트 및 시프트 연산자를 참조하세요.

C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.

설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.

팁 (조언)

C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.

논리 부정 연산자 !

단항 접두사 ! 연산자는 피연산자의 논리적 부정을 계산합니다. 피연산자를 true 계산하고 피연산자를 다음으로 falsefalse계산하는 경우 생성됩니다.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를 컴퓨팅합니다. 단항 & 연산자는 address-of 연산자입니다.

논리 배타적 OR 연산자 ^

^ 연산자는 해당 피연산자의 논리 XOR이라고도 하는 논리 배타적 OR을 컴퓨팅합니다. 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 또는 truex로 평가되면 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 연산자 &&

“단락(short-circuiting)” 논리 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 연산자 ||

“단락(short-circuiting)” 논리 OR 연산자로도 알려진 조건부 논리 OR 연산자 ||는 해당 피연산자의 논리 OR을 컴퓨팅합니다. x || y 또는 truex로 평가되면 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을 컴퓨팅하지만 항상 두 피연산자를 모두 평가합니다.

Nullable 부울 논리 연산자

피연산자의 & 경우bool? (논리 AND) 및 | (논리 OR) 연산자는 다음과 같이 세 가지 값 논리를 지원합니다.

  • 연산자는 & 두 피연산자가 모두 .로 계산되는 true경우에만 반환 true 됩니다. 또는 x 계산되는 x & yfalse경우 다른 피연산자를 계산하는 경우에도 반환 false 됩니다null.y 그러지 않으면 x & y의 결과는 null입니다.

  • | 연산자는 두 피연산자가 모두 false로 평가되는 경우에만 false를 생성합니다. x 또는 ytrue로 평가되는 경우 다른 피연산자가 x | y로 평가되더라도 truenull를 생성합니다. 그러지 않으면 x | y의 결과는 null입니다.

다음 표는 이 의미 체계를 보여 줍니다.

x y x &y x | Y
맞다 맞다 맞다 맞다
맞다 거짓 거짓 맞다
맞다 맞다
거짓 맞다 거짓 맞다
거짓 거짓 거짓 거짓
거짓 거짓
맞다 맞다
거짓 거짓

해당 연산자의 동작은 Nullable 값 형식을 사용하는 일반 연산자 동작과 다릅니다. 일반적으로 값 형식의 피연산자에 대해 정의된 연산자를 해당 nullable 값 형식의 피연산자에 사용할 수도 있습니다. 피연산자가 null로 평가되는 경우 해당 연산자는 null을 생성합니다. 그러나 피연산자 중 하나가 &로 평가되는 경우에도 |null 연산자는 Null이 아닌 값을 생성합니다. Nullable 값 형식을 사용한 연산자 동작에 대한 자세한 내용은 Nullable 값 형식 문서의 리프트된 연산자 섹션을 참조하세요.

다음 예제와 같이 !^ 연산자를 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# 14부터 사용자 정의 형식은 복합 할당 연산자를 명시적으로 오버로드하여 보다 효율적인 구현을 제공할 수 있습니다. 일반적으로 이진 작업의 결과를 유지하기 위해 새 인스턴스를 할당하는 대신 값을 현재 위치에서 업데이트할 수 있으므로 형식이 이러한 연산자를 오버로드합니다. 형식이 명시적 오버로드를 제공하지 않으면 컴파일러는 암시적 오버로드를 생성합니다.

사용자 정의 형식은 조건부 논리 연산자 &&||를 오버로드할 수 없습니다. 그러나 사용자 정의 형식이 true 및 false 연산자& 또는 | 연산자를 특정 방식으로 오버로드하는 경우 && 또는 || 작업은 각각 해당 형식의 피연산자에 대해 평가될 수 있습니다. 자세한 내용은 C# 언어 사양사용자 정의 조건부 논리 연산자 섹션을 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.

참고 항목