Logiska operatorer och bitvis-operatorer i Visual Basic
Logiska operatorer jämför Boolean
uttryck och returnerar ett Boolean
resultat. Operatorerna And
, Or
, AndAlso
, OrElse
och Xor
är binära eftersom de tar två operander, medan operatorn Not
är oföränderlig eftersom den tar en enda operand. Vissa av dessa operatorer kan också utföra bitvis logiska åtgärder på integralvärden.
Unary Logisk operator
Operatorn Inte utför logisk negation för ett Boolean
uttryck. Det ger den logiska motsatsen till sin operand. Om uttrycket utvärderas till True
returneras False
. Om uttrycket utvärderas till False
Not
returneras True
.Not
I följande exempel visas detta.
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
Binära logiska operatorer
Operatorn Och utför logisk konjunktion på två Boolean
uttryck. Om båda uttrycken utvärderas till True
And
returneras True
. Om minst ett av uttrycken utvärderas till False
And
returneras False
.
Operatorn Eller utför logisk disjunction eller inkludering i två Boolean
uttryck. Om något av uttrycken utvärderas till True
, eller båda utvärderas till True
, Or
returneras True
. Om inget av uttrycken utvärderas till True
Or
returnerar .False
Xor-operatorn utför logisk exkludering i två Boolean
uttryck. Om exakt ett uttryck utvärderas till True
, men inte båda, Xor
returnerar True
. Om båda uttrycken utvärderas till True
eller båda utvärderas till False
returneras Xor
False
.
I följande exempel visas operatorerna And
, Or
och 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.
Kortslutna logiska åtgärder
AndAlso-operatorn är mycket lik operatornAnd
, eftersom den också utför logisk konjunktion på två Boolean
uttryck. Den viktigaste skillnaden mellan de två är att AndAlso
uppvisar kortslutningsbeteende. Om det första uttrycket i ett AndAlso
uttryck utvärderas till False
utvärderas inte det andra uttrycket eftersom det inte kan ändra slutresultatet och AndAlso
returnerar False
.
På samma sätt utför OrElse-operatorn kortslutande logisk disjunction på två Boolean
uttryck. Om det första uttrycket i ett OrElse
uttryck utvärderas till True
utvärderas inte det andra uttrycket eftersom det inte kan ändra slutresultatet och OrElse
returnerar True
.
Kompromisser för kortslutning
Kortslutning kan förbättra prestanda genom att inte utvärdera ett uttryck som inte kan ändra resultatet av den logiska åtgärden. Men om uttrycket utför ytterligare åtgärder hoppar kortslutning över dessa åtgärder. Om uttrycket till exempel innehåller ett anrop till en Function
procedur anropas inte proceduren om uttrycket är kortslutet och eventuell ytterligare kod som ingår i Function
körs inte. Därför kan funktionen bara köras ibland och kanske inte testas korrekt. Eller så kan programlogik bero på koden i Function
.
I följande exempel visas skillnaden mellan And
, Or
och deras kortslutningsmotsvarigheter.
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
Observera i föregående exempel att viss viktig kod inuti checkIfValid()
inte körs när anropet är kortslutet. Den första If
instruktionen anropar checkIfValid()
även om 12 > 45
returnerar False
, eftersom And
inte kortsluter. Den andra If
instruktionen anropar checkIfValid()
inte , eftersom när 12 > 45
returnerar False
, AndAlso
kortsluter det andra uttrycket. Den tredje If
instruktionen anropar checkIfValid()
även om 12 < 45
returnerar True
, eftersom Or
inte kortsluter. Den fjärde If
instruktionen anropar checkIfValid()
inte , eftersom när 12 < 45
returnerar True
, OrElse
kortsluter det andra uttrycket.
Bitvis åtgärder
Bitvis-åtgärder utvärderar två integralvärden i binärt (bas 2)-formulär. De jämför bitarna vid motsvarande positioner och tilldelar sedan värden baserat på jämförelsen. I följande exempel visas operatorn And
.
Dim x As Integer
x = 3 And 5
I föregående exempel anges värdet x
1. Detta händer av följande skäl:
Värdena behandlas som binära:
3 i binär form = 011
5 i binär form = 101
Operatorn
And
jämför binära representationer, en binär position (bit) i taget. Om båda bitarna vid en given position är 1 placeras en 1 i den positionen i resultatet. Om endera biten är 0 placeras en 0 i den positionen i resultatet. I föregående exempel fungerar detta på följande sätt:011 (3 i binär form)
101 (5 i binär form)
001 (Resultatet, i binär form)
Resultatet behandlas som decimaltecken. Värdet 001 är den binära representationen av 1, så
x
= 1.
Bitvisåtgärden Or
är liknande, förutom att en 1 tilldelas till resultatbiten om endera eller båda av de jämförda bitarna är 1. Xor
tilldelar en 1 till resultatbiten om exakt en av de jämförda bitarna (inte båda) är 1. Not
tar en enda operand och invertera alla bitar, inklusive teckenbiten, och tilldelar det värdet till resultatet. Det innebär att för signerade positiva tal Not
returnerar alltid ett negativt värde och för negativa tal Not
returnerar alltid ett positivt eller nollvärde.
Operatorerna AndAlso
och OrElse
stöder inte bitvis åtgärder.
Kommentar
Bitvis åtgärder kan endast utföras på integraltyper. Flyttalsvärden måste konverteras till integraltyper innan bitvis åtgärd kan fortsätta.