Visual Basic의 논리 및 비트 연산자
논리 연산자는 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.
단락 논리 연산
AndAlso 연산자도 두 Boolean
식에서 논리적 결합을 수행한다는 점에서 And
연산자와 매우 유사합니다. 두 가지의 주요 차이점은 AndAlso
는 단락 동작을 보인다는 점입니다. AndAlso
식의 첫 번째 식이 False
로 평가되면 두 번째 식은 최종 결과를 변경할 수 없으므로 평가되지 않으며 AndAlso
는 False
를 반환합니다.
마찬가지로 OrElse 연산자는 두 Boolean
식에 대해 단락 논리적 분리를 수행합니다. OrElse
식의 첫 번째 식이 True
로 평가되면 두 번째 식은 최종 결과를 변경할 수 없으므로 평가되지 않으며 OrElse
는 True
를 반환합니다.
단락 트레이드오프
단락은 논리 연산의 결과를 변경할 수 없는 식을 평가하지 않음으로써 성능을 향상시킬 수 있습니다. 그러나 해당 식이 추가 작업을 수행하는 경우 단락은 해당 작업을 건너뜁니다. 예를 들어 식에 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
문은 And
가 단락되지 않으므로 12 > 45
에서 False
를 반환하더라도 checkIfValid()
를 호출합니다. 두 번째 If
문은 12 > 45
에서 False
를 반환할 때 AndAlso
가 두 번째 식을 단락하기 때문에 checkIfValid()
를 호출하지 않습니다. 세 번째 If
문은 Or
가 단락되지 않으므로 12 < 45
에서 True
를 반환하더라도 checkIfValid()
를 호출합니다. 네 번째 If
문은 12 < 45
에서 True
를 반환할 때 OrElse
가 두 번째 식을 단락하기 때문에 checkIfValid()
를 호출하지 않습니다.
비트 연산
비트 연산은 이진(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