Logische en bitwise operators in Visual Basic
Logische operators vergelijken Boolean
expressies en retourneren een Boolean
resultaat. De And
operatoren , Or
, AndAlso
en Xor
OrElse
operators zijn binair omdat ze twee operanden nemen, terwijl de Not
operator unaire is omdat er één operand nodig is. Sommige van deze operators kunnen ook bitwise logische bewerkingen uitvoeren op integrale waarden.
Unary Logical Operator
De operator Not voert logische negatie uit op een Boolean
expressie. Het levert het logische tegenovergestelde van de operand op. Als de expressie resulteert in True
, retourneert Not
False
deze ; als de expressie resulteert False
in , Not
retourneert True
de expressie . In het volgende voorbeeld ziet u dit.
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
Binaire logische operators
De and-operator voert logische combinaties uit op twee Boolean
expressies. Als beide expressies worden geëvalueerdTrue
, retourneert True
u .And
Als ten minste één van de expressies resulteert False
in , And
retourneert False
.
De operator Of voert logische disjunction of insluiting uit op twee Boolean
expressies. Als een van beide expressies True
resulteert in , of beide evalueren True
, wordt dan Or
geretourneerd True
. Als geen van beide expressies True
False
wordt geëvalueerd, Or
wordt het resultaat geretourneerd.
De Xor-operator voert logische uitsluiting uit op twee Boolean
expressies. Als precies één expressie resulteert in True
, maar niet beide, Xor
retourneert True
. Als beide expressies worden geëvalueerd True
of beide worden geëvalueerd False
, Xor
wordt geretourneerd False
.
In het volgende voorbeeld ziet u de And
operatoren , Or
en Xor
de operatoren.
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.
Logische bewerkingen kortsluiten
De AndAlso-operator is vergelijkbaar met de And
operator, omdat deze ook logische combinaties uitvoert op twee Boolean
expressies. Het belangrijkste verschil tussen de twee is dat AndAlso
kortsluitingsgedrag vertoont. Als de eerste expressie in een AndAlso
expressie wordt geëvalueerd False
, wordt de tweede expressie niet geëvalueerd omdat het uiteindelijke resultaat niet kan worden gewijzigd en AndAlso
wordt geretourneerd False
.
Op dezelfde manier voert de OrElse-operator een logische scheiding van kortsluiting uit op twee Boolean
expressies. Als de eerste expressie in een OrElse
expressie wordt geëvalueerd True
, wordt de tweede expressie niet geëvalueerd omdat het uiteindelijke resultaat niet kan worden gewijzigd en OrElse
wordt geretourneerd True
.
Kortsluitingsonderingen
Kortsluiting kan de prestaties verbeteren door geen expressie te evalueren die het resultaat van de logische bewerking niet kan wijzigen. Als deze expressie echter aanvullende acties uitvoert, slaat kortsluiting deze acties over. Als de expressie bijvoorbeeld een aanroep naar een Function
procedure bevat, wordt deze procedure niet aangeroepen als de expressie kortsluiting heeft en eventuele aanvullende code in de Function
expressie niet wordt uitgevoerd. Daarom kan de functie slechts af en toe worden uitgevoerd en wordt deze mogelijk niet correct getest. Of de programmalogica kan afhankelijk zijn van de code in de Function
.
In het volgende voorbeeld ziet u het verschil tussen And
, Or
en hun tegenhangers voor kortsluiting.
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
Houd er in het voorgaande voorbeeld rekening mee dat een aantal belangrijke code binnen checkIfValid()
niet wordt uitgevoerd wanneer de aanroep kortsluiting heeft. De eerste If
instructie roept aan, ook al 12 > 45
retourneert checkIfValid()
False
, omdat And
er geen kortsluiting is. De tweede If
instructie roept geen aan, checkIfValid()
omdat bij 12 > 45
retourneert, AndAlso
de tweede expressie kortcircuitsFalse
. De derde If
instructie roept aan, ook al 12 < 45
retourneert checkIfValid()
True
, omdat Or
er geen kortsluiting is. De vierde If
instructie roept geen aanroep checkIfValid()
, omdat bij 12 < 45
retourneert True
, OrElse
de tweede expressie kortsluitingen.
Bitsgewijze bewerkingen
Bitwise-bewerkingen evalueren twee integrale waarden in binaire vorm (basis 2). Ze vergelijken de bits op overeenkomende posities en wijzen vervolgens waarden toe op basis van de vergelijking. In het volgende voorbeeld ziet u de And
operator.
Dim x As Integer
x = 3 And 5
In het voorgaande voorbeeld wordt de waarde van x
1 ingesteld. Dit gebeurt om de volgende redenen:
De waarden worden behandeld als binair:
3 in binaire vorm = 011
5 in binaire vorm = 101
De
And
operator vergelijkt de binaire weergaven, één binaire positie (bit) tegelijk. Als beide bits op een bepaalde positie 1 zijn, wordt een 1 in die positie in het resultaat geplaatst. Als een van beide bits 0 is, wordt er een 0 in die positie in het resultaat geplaatst. In het voorgaande voorbeeld werkt dit als volgt:011 (3 in binaire vorm)
101 (5 in binaire vorm)
001 (het resultaat, in binaire vorm)
Het resultaat wordt behandeld als decimaal. De waarde 001 is de binaire weergave van 1, dus
x
= 1.
De bitsgewijze Or
bewerking is vergelijkbaar, behalve dat een 1 is toegewezen aan de resultaatbit als een van de vergeleken bits 1 is. Xor
wijst een 1 toe aan de resultaatbit als precies één van de vergeleken bits (niet beide) 1 is. Not
gebruikt één operand en zet alle bits om, inclusief de teken-bit, en wijst die waarde toe aan het resultaat. Dit betekent dat voor ondertekende positieve getallen Not
altijd een negatieve waarde wordt geretourneerd en voor negatieve getallen Not
altijd een positieve of nulwaarde wordt geretourneerd.
De AndAlso
en OrElse
operators bieden geen ondersteuning voor bitsgewijze bewerkingen.
Notitie
Bitwise-bewerkingen kunnen alleen worden uitgevoerd op integrale typen. Waarden voor drijvende komma moeten worden geconverteerd naar integrale typen voordat bitgewijze bewerkingen kunnen worden voortgezet.