Freigeben über


Logische und bitweise Operatoren in Visual Basic

Logische Operatoren vergleichen Boolean Ausdrücke und geben ein Boolean Ergebnis zurück. Die AndOperatoren , Or, , AndAlsoOrElseund Xor Operatoren sind binär, da sie zwei Operanden annehmen, während der Not Operator unär ist, da er einen einzelnen Operanden benötigt. Einige dieser Operatoren können auch bitweise logische Vorgänge für integrale Werte ausführen.

Unärer logischer Operator

Der Operator "Not" führt eine logische Negation für einen Boolean Ausdruck aus. Er liefert das logische Gegenteil zu seinem Operanden. Wenn der Ausdruck True ergibt, gibt NotFalse zurück; wenn der Ausdruck False ergibt, gibt NotTrue zurück. Im folgenden Beispiel wird dies 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 logische Konjunktionen für zwei Boolean Ausdrücke aus. Wenn beide Ausdrücke zu True ausgewertet werden, gibt AndTrue zurück. Wenn mindestens einer der Ausdrücke den Wert False ergibt, dann gibt AndFalse zurück.

Der Or-Operator führt logische Disjunktion oder Einschluss in zwei Boolean Ausdrücken durch. Wenn entweder ein Ausdruck als True ausgewertet wird oder beide als True ausgewertet werden, dann gibt OrTrue zurück. Wenn keiner der Ausdrücke als True ausgewertet wird, gibt Or den Wert False zurück.

Der Xor-Operator führt logischen Ausschluss für zwei Boolean Ausdrücke aus. Wenn genau ein Ausdruck als True ausgewertet wird, aber nicht beide, gibt XorTrue zurück. Wenn beide Ausdrücke auf True oder False ausgewertet werden, gibt XorFalse zurück.

Im folgenden Beispiel werden die And, Or und Xor Operatoren 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.

Short-Circuiting logische Vorgänge

Der AndAlso-Operator ist dem Operator sehr ähnlich And , da er auch logische Konjunktionen für zwei Boolean Ausdrücke ausführt. Der Hauptunterschied zwischen den beiden besteht darin, dass AndAlso ein Kurzschlussverhalten aufweist. Wenn der erste Ausdruck in einem AndAlso Ausdruck zu False ausgewertet wird, wird der zweite Ausdruck nicht ausgewertet, da er das Endergebnis nicht verändern kann und AndAlsoFalse zurückgibt.

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 zu True ausgewertet wird, wird der zweite Ausdruck nicht ausgewertet, da er das Endergebnis nicht verändern kann und OrElseTrue zurückgibt.

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 kann die Funktion nur gelegentlich ausgeführt werden und möglicherweise nicht ordnungsgemäß getestet werden. Oder möglicherweise hängt die Programmlogik vom Code in Function ab.

Das folgende Beispiel veranschaulicht den Unterschied zwischen And, Or und deren Kurzschluss-Gegenstücken.

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 vorherigen Beispiel, dass einige wichtige Code innerhalb checkIfValid() nicht ausgeführt werden, wenn der Anruf kurzgeschaltet ist. 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, weil 12 > 45False zurückgibt und AndAlso den zweiten Ausdruck dadurch überspringt. Die dritte If Anweisung ruft checkIfValid() auf, auch wenn 12 < 45True zurückgibt, da Or keinen Kurzschluss verursacht. Die vierte If-Anweisung ruft checkIfValid() nicht auf, da 12 < 45 eine Kurzschlussauswertung für den zweiten Ausdruck durchführt, wenn True den Wert OrElse zurückgibt.

Bitweise Operationen

Bitweise Vorgänge werten zwei integrale Werte in binärer Form (Basis 2) aus. Sie vergleichen die Bits an 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 in binärer Form = 011

    5 in binärer Form = 101

  • Der And-Operator vergleicht die binären Darstellungen, eine Binärposition (Bit) nach der anderen. Wenn beide Bits an einer bestimmten Position 1 sind, wird eine 1 an dieser Position im Ergebnis platziert. Wenn eines der Bits 0 ist, wird eine 0 an dieser Position im Ergebnis platziert. Im vorstehenden Beispiel funktioniert dies wie folgt:

    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, also x = 1.

Der bitweise Or Vorgang ist ähnlich, mit der Ausnahme, dass dem Ergebnisbit eine 1 zugewiesen wird, wenn eine oder beide der verglichenen Bits 1 sind. Xor weist dem Ergebnisbit eine 1 zu, wenn genau eines der verglichenen Bits (nicht beide) 1 ist. Not verwendet einen einzelnen Operanden und invertiert alle Bits, einschließlich des Zeichenbits, und weist diesen Wert dem Ergebnis zu. Dies bedeutet, Not dass bei signierten positiven Zahlen immer ein negativer Wert zurückgegeben wird und für negative Zahlen Not immer ein positiver oder Nullwert zurückgegeben wird.

Die Operatoren AndAlso und OrElse unterstützen keine bitweisen Vorgänge.

Hinweis

Bitweise Vorgänge können nur für integrale Typen ausgeführt werden. Gleitkommawerte müssen in integrale Typen konvertiert werden, bevor die bitweise Operation fortgesetzt werden kann.

Siehe auch