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 akzeptieren, während der Operator Not unär ist, weil er einen einzigen Operanden akzeptiert. Einige dieser Operatoren können auch bitweise logische Operationen für ganzzahlige Werte ausführen.

Unärer logischer Operator

Der Not-Operator (Visual Basic) führt eine logische Negation für einen Boolean-Ausdruck aus. Das Ergebnis ist das logische Gegenteil seines Operanden. Wenn der Ausdruck True ergibt, gibt Not den Wert False zurück. Wenn der Ausdruck False ergibt, 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 (Visual Basic) führt eine logische Konjunktion für zwei Boolean-Ausdrücke aus. Wenn beide Ausdrücke True ergeben, gibt And den Wert True zurück. Wenn mindestens einer der Ausdrücke False ergibt, gibt And den Wert False zurück.

Der Or-Operator (Visual Basic) führt eine logische Disjunktion oder Inklusion für zwei Boolean-Ausdrücke aus. Wenn einer von beiden Ausdrücken True ergibt oder wenn beide Ausdrücke True ergeben, gibt Or den Wert True zurück. Wenn keiner der beiden Ausdrücke True ergibt, gibt Or den Wert False zurück.

Der Xor-Operator (Visual Basic) führt einen logischen Ausschluss für zwei Boolean-Ausdrücke aus. Wenn genau ein Ausdruck True ergibt, jedoch nicht beide Ausdrücke, gibt Xor den Wert True zurück. Wenn beide Ausdrücke True ergeben oder wenn beide Ausdrücke False ergeben, gibt Xor den Wert False zurück.

Im folgenden Beispiel werden die Operatoren And, Or und Xor veranschaulicht.

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 Kurzschlussoperationen

Der AndAlso-Operator (Visual Basic)- ist dem Operator And sehr ähnlich. Er führt ebenfalls eine logische Konjunktion für zwei Boolean-Ausdrücke aus. Der Hauptunterschied zwischen den beiden Operatoren ist, dass AndAlso Kurzschlussverhalten aufweist. Wenn der erste Ausdruck in einem AndAlso-Ausdruck False ist, wird der zweite Ausdruck nicht ausgewertet, weil das Ergebnis hierdurch nicht geändert wird, und AndAlso gibt False zurück.

Der OrElse-Operator (Visual Basic) führt eine logische Kurzschlussdisjunktion für zwei Boolean-Ausdrücke aus. Wenn der erste Ausdruck in einem OrElse-Ausdruck True ist, wird der zweite Ausdruck nicht ausgewertet, weil das Ergebnis hierdurch nicht geändert wird, und OrElse gibt True zurück.

Vor-und Nachteile von Kurzschlussverhalten

Durch Kurzschlussverhalten kann die Leistung erhöht werden, weil ein Ausdruck, der das Ergebnis der logischen Operation nicht ändern kann, nicht ausgewertet wird. Wenn dieser Ausdruck zusätzliche Aktionen ausführt, werden diese Aktionen jedoch bei Kurzschlussverhalten übersprungen. Wenn der Ausdruck z. B. einen Aufruf einer Function-Prozedur enthält, wird diese Prozedur nicht aufgerufen, sofern der Ausdruck kurzgeschlossen wird, und zusätzlicher Code in Function wird nicht ausgeführt. Deshalb wird die Funktion möglicherweise nur gelegentlich ausgeführt werden und somit nicht ordnungsgemäß getestet. Oder die Programmlogik könnte vom Code in Function abhängen.

Im folgenden Beispiel wird der Unterschied zwischen And, Or und ihren entsprechenden Kurzschlussoperatoren veranschaulicht.

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 vorhergehenden Beispiel, dass wichtiger Code in checkIfValid() nicht ausgeführt wird, wenn der Aufruf kurzgeschlossen wird. Die erste If-Anweisung ruft checkIfValid() auf, obwohl 12 > 45 False zurückgibt, da And keinen Kurzschluss ausführt. Die zweite If-Anweisung ruft checkIfValid() nicht auf, weil mit AndAlso der zweite Ausdruck kurzgeschlossen wird, wenn 12 > 45 False zurückgibt. Die dritte If-Anweisung ruft checkIfValid() auf, obwohl 12 < 45 True zurückgibt, da Or keinen Kurzschluss ausführt. Die vierte If-Anweisung ruft checkIfValid() nicht auf, weil mit OrElse der zweite Ausdruck kurzgeschlossen wird, wenn 12 < 45 True zurückgibt.

Bitweise Operationen

Bitweise Operationen werten zwei ganzzahlige Werte in binärer Form (Basis 2) aus. Sie vergleichen die Bits an den entsprechenden Positionen und weisen dann auf dem Vergleich basierende Werte zu. Im folgenden Beispiel wird der Operator And veranschaulicht.

Dim x As Integer
x = 3 And 5

Im vorherigen Beispiel wird der Wert von x auf 1 festgelegt. Dies geschieht aus den folgenden Gründen:

  • Die Werte werden als binär behandelt:

    3 in binärer Form = 011

    5 in binärer Form = 101

  • Der Operator And vergleicht die binären Darstellungen, und zwar jeweils eine binäre Position (ein Bit). Wenn beide Bits an einer angegebenen Position 1 sind, wird als Ergebnis eine 1 an dieser Position gesetzt. Wenn eines der Bits 0 ist, wird als Ergebnis eine 0 an dieser Position gesetzt. Im vorherigen Beispiel ergibt dies Folgendes:

    011 (3 in binärer Form)

    101 (5 in binärer Form)

    001 (das Ergebnis in binärer Form)

  • Das Ergebnis wird als Dezimalzahl behandelt. Der Wert 001 ist die binäre Darstellung von 1, daher x = 1.

Die bitweise Or-Operation ist ähnlich, nur wird dem Ergebnisbit 1 zugewiesen, wenn eines oder beide der verglichenen Bits 1 sind. Xor weist dem Ergebnisbit 1 zu, wenn nur eines (jedoch nicht beide) der verglichenen Bits 1 ist. Not akzeptiert einen einzigen Operanden und kehrt alle Bits um, einschließlich des Vorzeichenbits, und weist dem Ergebnis diesen Wert zu. Das bedeutet, dass Not für positive Zahlen mit Vorzeichen immer einen negativen Wert zurückgibt und dass Not für negative Zahlen immer eine positive Zahl oder 0 (null) zurückgibt.

Der Operator AndAlso und der Operator OrElse unterstützen keine bitweisen Operationen.

Tipp

Bitweise Operationen können nur für ganzzahlige Typen ausgeführt werden. Gleitkommawerte müssen in ganzzahlige Typen konvertiert werden, bevor bitweise Operationen ausgeführt werden können.

Siehe auch

Referenz

Logische/bitweise Operatoren (Visual Basic)

Konzepte

Boolesche Ausdrücke (Visual Basic)

Arithmetische Operatoren in Visual Basic

Vergleichsoperatoren in Visual Basic

Verkettungsoperatoren in Visual Basic

Effiziente Kombination von Operatoren (Visual Basic)

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Januar 2011

Der Abschnitt "Vor-und Nachteile von Kurzschlussverhalten" wurde geändert.

Informationsergänzung.