다음을 통해 공유


부울 논리 연산자 - 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 부울 논리 연산자

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

  • 연산자는 & 두 피연산자가 모두 .로 계산되는 true경우에만 반환 true 됩니다. 또는 x 계산되는 yfalse경우 다른 피연산자를 계산하는 경우에도 반환 x & y 됩니다false.null 그러지 않으면 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

참고 항목

조건부 논리 연산자 &&||는 복합 할당을 지원하지 않습니다.

연산자 우선 순위

다음 목록에서는 가장 높은 우선 순위에서 가장 낮은 값으로 시작하는 그룹의 논리 연산자를 정렬합니다.

괄호(())를 사용하여 연산자 우선 순위에 따라 주어진 평가 순서를 변경합니다.

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# 언어 사양의 다음 섹션을 참조하세요.

참고 항목