Operatorrangfolge in Visual Basic

Wenn mehrere Vorgänge in einem Ausdruck auftreten, wird jeder Teil ausgewertet und in einer vordefinierten Reihenfolge aufgelöst, die als Operatorrangfolge bezeichnet wird.

Rangfolgenregeln

Wenn Ausdrücke Operatoren aus mehreren Kategorien enthalten, werden sie gemäß den folgenden Regeln ausgewertet:

  • Die Arithmetik- und Verkettungsoperatoren haben die im folgenden Abschnitt beschriebene Rangfolge, und alle haben eine höhere Rangfolge als die vergleichs-, logischen und bitweisen Operatoren.

  • Alle Vergleichsoperatoren haben die gleiche Rangfolge, und alle haben eine höhere Rangfolge als die logischen und bitweisen Operatoren, aber eine niedrigere Rangfolge als die Arithmetik- und Verkettungsoperatoren.

  • Die logischen und bitweisen Operatoren haben die im folgenden Abschnitt beschriebene Rangfolge, und alle haben eine niedrigere Rangfolge als die Arithmetik-, Verkettungs- und Vergleichsoperatoren.

  • Operatoren mit gleicher Rangfolge werden von links nach rechts in der Reihenfolge ausgewertet, in der sie im Ausdruck angezeigt werden.

Rangfolgenreihenfolge

Operatoren werden in der folgenden Rangfolge ausgewertet:

Await-Operator

Await-

Arithmetische und Verkettungsoperatoren

Exponentiation ( ^ )

Unäre Identität und Negation ( + , )

Multiplikation und Gleitkommadivision ( * , / )

Ganzzahlige Division ( \ )

Modulare Arithmetik ( Mod )

Addition und Subtraktion ( + , )

Zeichenfolgenverkettung ( & )

Arithmetische Bitverschiebung ( << , >> )

Vergleichsoperatoren

Alle Vergleichsoperatoren ( = , , , , , , , , , <> ... < <= > >= Is IsNot Like TypeOf Is )

Logische und bitweise Operatoren

Negation ( Not )

Konjunktion ( And , AndAlso )

Inklusive Disjunktion ( Or , OrElse )

Exklusive Disjunktion ( Xor )

Kommentare

Der = Operator ist nur der Gleichheitsvergleichsoperator, nicht der Zuweisungsoperator.

Der Zeichenfolgenverkettungsoperator ( & ) ist kein arithmetischer Operator, aber in der Rangfolge wird er mit den arithmetischen Operatoren gruppiert.

Die Is IsNot Operatoren und sind Objektverweisvergleichsoperatoren. Sie vergleichen nicht die Werte von zwei Objekten. sie überprüfen nur, ob zwei Objektvariablen auf dieselbe Objektinstanz verweisen.

Assoziativität

Wenn Operatoren gleicher Rangfolge zusammen in einem Ausdruck angezeigt werden, z. B. Multiplikation und Division, wertet der Compiler jeden Vorgang aus, während er von links nach rechts gefunden wird. Dies wird anhand des folgenden Beispiels veranschaulicht.

Dim n1 As Integer = 96 / 8 / 4
Dim n2 As Integer = (96 / 8) / 4
Dim n3 As Integer = 96 / (8 / 4)

Der erste Ausdruck wertet die Division 96/8 (ergibt 12) und dann die Division 12/4 aus, was zu drei führt. Da der Compiler die Vorgänge für von links nach rechts auswertet, n1 ist die Auswertung identisch, wenn diese Reihenfolge explizit für angegeben n2 wird. Sowohl als auch n1 haben ein Ergebnis von n2 drei. Im Gegensatz dazu n3 hat ein Ergebnis von 48, da die Klammern den Compiler dazu zwingen, zuerst 8/4 auszuwerten.

Aufgrund dieses Verhaltens werden Operatoren in Visual Basic als assoziativ belassen.

Überschreiben von Rangfolge und Assoziativität

Sie können Klammern verwenden, um zu erzwingen, dass einige Teile eines Ausdrucks vor anderen ausgewertet werden. Dies kann sowohl die Rangfolge als auch die linke Assoziativität überschreiben. Visual Basic führt immer Vorgänge aus, die in Klammern vor den externen Klammern eingeschlossen sind. Innerhalb von Klammern behält es jedoch die normale Rangfolge und Assoziativität bei, es sei denn, Sie verwenden Klammern innerhalb der Klammern. Dies wird anhand des folgenden Beispiels veranschaulicht.

Dim a, b, c, d, e, f, g As Double
a = 8.0
b = 3.0
c = 4.0
d = 2.0
e = 1.0
f = a - b + c / d * e
' The preceding line sets f to 7.0. Because of natural operator
' precedence and associativity, it is exactly equivalent to the
' following line.
f = (a - b) + ((c / d) * e)
' The following line overrides the natural operator precedence
' and left associativity.
g = (a - (b + c)) / (d * e)
' The preceding line sets g to 0.5.

Siehe auch