Logische und bitweise Operatoren in Visual Basic
Logische Operatoren vergleichen Boolean
-Ausdrücke und geben ein Boolean
-Ergebnis zurück. Die Operatoren And
, Or
, AndAlso
, OrElse
und Xor
sind binär, weil sie zwei Operanden benötigen. Der Operator Not
hingegen ist unär, weil er nur einen einzigen Operanden benötigt. Einige dieser Operatoren können auch bitweise logische Operationen für Integralwerte durchführen.
Unärer logischer Operator
Der Not-Operator führt eine logische Negation für einen Boolean
-Ausdruck aus. Er liefert das logische Gegenteil zu seinem Operanden. Wenn der Ausdruck als True
ausgewertet wird, dann gibt Not
den Wert False
zurück. Wird der Ausdruck als False
ausgewertet, dann gibt Not
den Wert True
zurück. Dies wird anhand des folgenden Beispiels veranschaulicht.
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äre logische Operatoren
Der And-Operator führt eine logische Konjunktion von zwei Boolean
-Ausdrücken durch. Wenn beide Ausdrücke als True
ausgewertet werden, dann gibt And
den Wert True
zurück. Wenn mindestens einer der Ausdrücke als False
ausgewertet wird, dann gibt And
den Wert False
zurück.
Der Or-Operator führt eine logische Disjunktion oder einen Einschluss für zwei Boolean
-Ausdrücke durch. Wenn einer der beiden Ausdrücke als True
ausgewertet wird oder beide als True
ausgewertet werden, dann gibt Or
den Wert True
zurück. Wenn keiner der Ausdrücke als True
ausgewertet wird, gibt Or
den Wert False
zurück.
Der Xor-Operator führt einen logischen Ausschluss für zwei Boolean
-Ausdrücke durch. Wenn genau ein Ausdruck (aber nicht beide) als True
ausgewertet wird, gibt Xor
den Wert True
zurück. Wenn beide Ausdrücke als True
oder beide als False
ausgewertet werden, gibt Xor
den Wert False
zurück.
Das folgende Beispiel veranschaulicht die And
-, Or
- und Xor
-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 Operationen mit Kurzschlussauswertung
Der AndAlso-Operator ist dem And
-Operator sehr ähnlich, da er ebenfalls eine logische Konjunktion für zwei Boolean
-Ausdrücke durchführt. Der Hauptunterschied zwischen den beiden Operatoren liegt darin, dass AndAlso
eine Kurzschlussauswertung durchführt. Wenn der erste Ausdruck in einem AndAlso
-Ausdruck als False
ausgewertet wird, dann wird der zweite Ausdruck nicht ausgewertet, da er das endgültige Ergebnis nicht verändern kann, und AndAlso
gibt False
zurück.
In ähnlicher Weise führt der OrElse-Operator eine Kurzschlussauswertung bei einer logischen Disjunktion von zwei Boolean
-Ausdrücke durch. Wenn der erste Ausdruck in einem OrElse
-Ausdruck als True
ausgewertet wird, dann wird der zweite Ausdruck nicht ausgewertet, da er das endgültige Ergebnis nicht verändern kann, und OrElse
gibt True
zurück.
Zielkonflikte bei der Kurzschlussauswertung
Eine Kurzschlussauswertung kann die Leistung verbessern, indem ein Ausdruck, der das Ergebnis der logischen Operation nicht verändern kann, nicht ausgewertet wird. Wenn dieser Ausdruck jedoch zusätzliche Aktionen ausführt, werden diese Aktionen bei der Kurzschlussauswertung übersprungen. Wenn der Ausdruck beispielsweise einen Aufruf einer Function
-Prozedur enthält, wird diese Prozedur bei einer Kurzschlussauswertung des Ausdrucks nicht aufgerufen, und jeglicher weiterer Code, der in Function
enthalten ist, wird nicht ausgeführt. Daher wird die Funktion möglicherweise nur gelegentlich ausgeführt und unter Umständen nicht ordnungsgemäß getestet. Oder möglicherweise hängt die Programmlogik vom Code in Function
ab.
Das folgende Beispiel veranschaulicht den Unterschied zwischen And
, Or
und ihren Pendants für die Kurzschlussauswertung.
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
Beachten Sie im obigen Beispiel, dass wichtiger Code innerhalb von checkIfValid()
nicht ausgeführt wird, wenn für den Aufruf eine Kurzschlussauswertung durchgeführt wird. Die erste If
-Anweisung ruft checkIfValid()
auf, obwohl 12 > 45
den Wert False
zurückgibt, da And
keine Kurzschlussauswertung durchführt. Die zweite If
-Anweisung ruft checkIfValid()
nicht auf, da AndAlso
für den zweiten Ausdruck eine Kurzschlussauswertung durchführt, wenn 12 > 45
den Wert False
zurückgibt. Die dritte If
-Anweisung ruft checkIfValid()
auf, obwohl 12 < 45
den Wert True
zurückgibt, da Or
keine Kurzschlussauswertung durchführt. Die vierte If
-Anweisung ruft checkIfValid()
nicht auf, da OrElse
eine Kurzschlussauswertung für den zweiten Ausdruck durchführt, wenn 12 < 45
den Wert True
zurückgibt.
Bitweise Operationen
Bitweise Operationen werten zwei Integralwerte im Binärformat (Basis 2) aus. Sie vergleichen die Bits an den entsprechenden Positionen und weisen dann basierend auf dem Vergleich Werte zu. Das folgende Beispiel veranschaulicht den And
-Operator.
Dim x As Integer
x = 3 And 5
Im vorherigen Beispiel wird der Wert von x
auf 1 festgelegt. Dies geschieht aus folgenden Gründen:
Die Werte werden als binär behandelt:
3 im Binärformat = 011
5 im Binärformat = 101
Der
And
-Operator vergleicht die binären Darstellungen, eine Binärposition (Bit) nach der anderen. Wenn beide Bits an einer bestimmten Position 1 lauten, wird an dieser Position im Ergebnis eine 1 eingefügt. Wenn eines der Bits 0 lautet, wird an dieser Stelle des Ergebnisses eine 0 eingefügt. Im vorangegangenen Beispiel sieht das folgendermaßen aus:011 (3 im Binärformat)
101 (5 im Binärformat)
001 (das Ergebnis im Binärformat)
Das Ergebnis wird als Dezimalwert behandelt. Der Wert 001 ist die binäre Darstellung von 1, also
x
= 1.
Der bitweise Or
-Operator funktioniert ähnlich, mit dem Unterschied, dass dem Ergebnisbit eine 1 zugewiesen wird, wenn eines oder beide der verglichenen Bits 1 lauten. Xor
weist dem Ergebnisbit eine 1 zu, wenn genau eines der verglichenen Bits (nicht beide) 1 lautet. Not
akzeptiert einen einzelnen Operanden, invertiert alle Bits (einschließlich des Vorzeichenbits) und ordnet diesen Wert dem Ergebnis zu. Somit liefert Not
für positive Zahlen mit Vorzeichen immer einen negativen Wert, und für negative Zahlen gibt Not
immer einen positiven Wert oder 0 zurück.
Die Operatoren AndAlso
und OrElse
unterstützen keine bitweisen Operationen.
Hinweis
Bitweise Operationen können nur für integrale Typen durchgeführt werden. Gleitkommawerte müssen in integrale Typen konvertiert werden, bevor die bitweise Operation fortgesetzt werden kann.