부울 논리 연산자 - AND, OR, NOT, XOR
논리 부울 연산자는 bool 피연산자를 사용하여 논리 연산을 수행합니다. 연산자에는 단항 논리 부정(!
), 이진 논리 AND(&
), OR(|
), 배타적 OR(^
), 이진 조건부 논리 AND(&&
) 및 OR(||
)가 포함됩니다.
- 단항
!
(논리 부정) 연산자. - 이진
&
(논리 AND),|
(논리 OR) 및^
(논리 배타적 OR) 연산자. 해당 연산자는 항상 두 피연산자를 모두 평가합니다. - 이진
&&
(조건부 논리 AND) 및||
(조건부 논리 OR) 연산자. 해당 연산자는 필요한 경우에만 오른쪽 피연산자를 평가합니다.
정수 형식 피연산자의 경우 &
, |
및 ^
연산자는 비트 논리 작업을 수행합니다. 자세한 내용은 비트 및 시프트 연산자를 참조하세요.
논리 부정 연산자 !
단항 접두사 !
연산자는 해당 피연산자의 논리 부정을 계산합니다. 즉, 피연산자가 false
로 평가되는 경우 true
를 생성하고, 피연산자가 true
로 평가되는 경우 false
를 생성합니다.
bool passed = false;
Console.WriteLine(!passed); // output: True
Console.WriteLine(!true); // output: False
단항 후위 !
연산자는 null 허용 연산자입니다.
논리 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를 컴퓨팅합니다. 단항 &
연산자는 address-of 연산자입니다.
논리 배타적 OR 연산자 ^
^
연산자는 해당 피연산자의 논리 XOR이라고도 하는 논리 배타적 OR을 컴퓨팅합니다. x
가 true
로 평가되고 y
가 false
로 평가되거나, x
가 false
로 평가되고 y
가 true
로 평가되는 경우 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 연산자 &&
“단락(short-circuiting)” 논리 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 연산자 ||
“단락(short-circuiting)” 논리 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을 컴퓨팅하지만 항상 두 피연산자를 모두 평가합니다.
Nullable 부울 논리 연산자
bool?
피연산자의 경우 &
(논리적 AND) 및 |
(논리적 OR) 연산자는 다음과 같이 값이 세 개인 논리를 지원합니다.
&
연산자는 두 피연산자가 모두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 |
해당 연산자의 동작은 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# 연산자 문서의 연산자 우선 순위 섹션을 참조하세요.
연산자 오버로드 가능성
사용자 정의 형식은 !
, &
, |
및 ^
연산자를 오버로드할 수 있습니다. 이항 연산자가 오버로드되면 해당하는 복합 대입 연산자도 암시적으로 오버로드됩니다. 사용자 정의 형식은 복합 대입 연산자를 명시적으로 오버로드할 수 없습니다.
사용자 정의 형식은 조건부 논리 연산자 &&
및 ||
를 오버로드할 수 없습니다. 그러나 사용자 정의 형식이 true 및 false 연산자와 &
또는 |
연산자를 특정 방식으로 오버로드하는 경우 &&
또는 ||
작업은 각각 해당 형식의 피연산자에 대해 평가될 수 있습니다. 자세한 내용은 C# 언어 사양의 사용자 정의 조건부 논리 연산자 섹션을 참조하세요.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.
참고 항목
.NET