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.

Siehe auch