논리 연산자는 Boolean
식을 비교하고 Boolean
결과를 반환합니다.
And
, Or
, AndAlso
, OrElse
및 Xor
연산자는 두 개의 피연산자를 사용하므로 이진이지만 Not
연산자는 단일 피연산자를 사용하므로 단항입니다. 이러한 연산자 중 일부는 정수 값에 대해 비트 논리 연산을 수행할 수도 있습니다.
단항 논리 연산자
Not 연산자는 표현식에 대해 논리적 Boolean
을 수행합니다. 피연산자의 논리적 반대를 생성합니다. 식이 True
로 계산되면 Not
는 False
를 반환하고, 식이 False
로 계산되면 Not
는 True
를 반환합니다. 다음 예제에서는 이를 보여 줍니다.
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
이진 논리 연산자
And 연산자는 두 식에 대해 논리적 Boolean
을 수행합니다. 두 식이 모두 True
로 평가되면, And
는 True
를 반환합니다. 적어도 하나의 식의 결과가 False
이면, And
는 False
를 반환합니다.
Or 연산자는 두 식에 대한 논리적 분리 또는 Boolean
을 수행합니다. 식 중 하나가 True
로 평가되거나 둘 다 True
로 평가되면, Or
는 True
을(를) 반환합니다. 두 식이 모두 True
로 평가되지 않으면, Or
는 False
를 반환합니다.
Xor 연산자는 두 식에 대해 논리적 Boolean
를 수행합니다. 하나의 식이 정확히 True
로 평가되지만, 둘 다 그렇지는 않으면 Xor
가 True
를 반환합니다. 두 식이 모두 True
으로 계산되거나 모두 False
으로 계산되면, Xor
은 False
를 반환합니다.
다음 예제에서는 And
, Or
, 및 Xor
연산자를 보여 줍니다.
Dim a, b, c, d, e, f, g As Boolean
a = 23 > 14 And 11 > 8
b = 14 > 23 And 11 > 8
' The preceding statements set a to True and b to False.
c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.
e = 23 > 67 Xor 11 > 8
f = 23 > 14 Xor 11 > 8
g = 14 > 23 Xor 8 > 11
' The preceding statements set e to True, f to False, and g to False.
Short-Circuiting 논리 작업
AndAlso 연산자는 두 And
식에 대해 논리적 합을 수행한다는 점에서 Boolean
연산자와 매우 유사합니다. 둘 사이의 주요 차이점은 AndAlso
쇼트 회로 동작을 나타낸다는 것입니다. 첫 번째 식 AndAlso
가 False
로 평가되면, 두 번째 식은 최종 결과를 변경할 수 없기 때문에 계산되지 않고 AndAlso
가 False
를 반환합니다.
마찬가지로 OrElse 연산자는 두 Boolean
식에서 단락 논리 분리를 수행합니다. 첫 번째 식 OrElse
가 True
로 평가되면, 두 번째 식은 최종 결과를 변경할 수 없기 때문에 계산되지 않고 OrElse
가 True
를 반환합니다.
Short-Circuiting Trade-Offs
단락 평가(short-circuiting)는 논리 연산의 결과에 영향을 주지 않는 식을 평가하지 않음으로써 성능을 향상시킬 수 있습니다. 그러나 해당 식이 추가 작업을 수행하는 경우 단락은 해당 작업을 건너뜁니다. 예를 들어, 식에 Function
프로시저 호출이 포함되어 있는 경우, 식이 단락 평가될 때 프로시저가 호출되지 않으며, Function
에 포함된 추가 코드는 실행되지 않습니다. 따라서 함수는 가끔만 실행될 수 있으며 올바르게 테스트되지 않을 수 있습니다. 또는 프로그램 논리는 .의 Function
코드에 따라 달라질 수 있습니다.
다음 예제는 And
과 Or
및 그들의 단락 평가 대응 간의 차이점을 보여줍니다.
Dim amount As Integer = 12
Dim highestAllowed As Integer = 45
Dim grandTotal As Integer
If amount > highestAllowed And checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount > highestAllowed AndAlso checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
If amount < highestAllowed Or checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount < highestAllowed OrElse checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
Function checkIfValid(ByVal checkValue As Integer) As Boolean
If checkValue > 15 Then
MsgBox(CStr(checkValue) & " is not a valid value.")
' The MsgBox warning is not displayed if the call to
' checkIfValid() is part of a short-circuited expression.
Return False
Else
grandTotal += checkValue
' The grandTotal value is not updated if the call to
' checkIfValid() is part of a short-circuited expression.
Return True
End If
End Function
앞의 예제에서는 호출이 단락될 때 내부의 checkIfValid()
몇 가지 중요한 코드가 실행되지 않습니다. 첫 번째 If
문은 checkIfValid()
가 12 > 45
를 반환하더라도, False
는 단락 평가를 수행하지 않기 때문에 And
을 호출합니다. 두 번째 If
문은 checkIfValid()
를 호출하지 않습니다. 이는 12 > 45
가 False
를 반환할 때 AndAlso
가 두 번째 식을 단락시키기 때문입니다. 세 번째 If
문은 checkIfValid()
이(가) 단락 평가를 하지 않기 때문에, 12 < 45
이(가) True
을(를) 반환하더라도 Or
을(를) 호출합니다. 네 번째 If
문은 checkIfValid()
을 호출하지 않습니다. 왜냐하면 12 < 45
가 True
을 반환할 때, OrElse
가 두 번째 식의 평가를 중단하기 때문입니다.
비트 연산
비트 연산은 이진(base 2) 형식으로 두 개의 정수 값을 평가합니다. 해당 위치의 비트를 비교한 다음 비교에 따라 값을 할당합니다. 다음 예제에서는 연산자를 And
보여 줍니다.
Dim x As Integer
x = 3 And 5
앞의 x
예제에서는 값을 1로 설정합니다. 이 문제는 다음과 같은 이유로 발생합니다.
값은 이진으로 처리됩니다.
이진 형식의 3 = 011
이진 형식의 5 = 101
And
연산자는 이진 표현을 한 번에 하나의 이진 위치(비트)로 비교합니다. 지정된 위치에 있는 두 비트가 모두 1이면 결과에서 해당 위치에 1이 배치됩니다. 두 비트 중 하나가 0이면 결과의 해당 위치에 0이 배치됩니다. 앞의 예제에서는 다음과 같이 작동합니다.011(이진 형식의 3)
101(이진 형식의 5개)
001(이진 형식의 결과)
결과는 10진수로 처리됩니다. 값 001은 1의 이진 표현이므로
x
= 1입니다.
비교된 비트 Or
중 하나 또는 둘 다 1인 경우 1이 결과 비트에 할당된다는 점을 제외하고 비트 연산은 비슷합니다.
Xor
는 비교된 비트 중 하나(둘 다 아님)가 1이면 결과 비트에 1을 할당합니다.
Not
는 단일 피연산자를 사용하고 부호 비트를 포함한 모든 비트를 반전하고 해당 값을 결과에 할당합니다. 즉, Not
부호 있는 양수의 경우 항상 음수 값을 반환하고 음수의 Not
경우 항상 양수 또는 0 값을 반환합니다.
AndAlso
및 OrElse
연산자는 비트 연산을 지원하지 않습니다.
비고
비트 연산은 정수 계열 형식에서만 수행할 수 있습니다. 비트 연산을 진행하려면 부동 소수점 값을 정수 형식으로 변환해야 합니다.
참고하십시오
.NET