Precedenza tra gli operatori in Visual Basic
Quando si verificano più operazioni in un'espressione, ogni parte viene valutata e risolta in un ordine predeterminato denominato precedenza dell'operatore.
Regole di precedenza
Quando le espressioni contengono operatori di più categorie, vengono valutate in base alle regole seguenti:
Gli operatori aritmetici e di concatenazione hanno l'ordine di precedenza descritto nella sezione seguente e hanno una precedenza maggiore rispetto agli operatori di confronto, logici e bit per bit.
Tutti gli operatori di confronto hanno una precedenza uguale e tutti hanno una precedenza maggiore rispetto agli operatori logici e bit per bit, ma una precedenza inferiore rispetto agli operatori aritmetici e di concatenazione.
Gli operatori logici e bit per bit hanno l'ordine di precedenza descritto nella sezione seguente e tutti hanno una precedenza inferiore rispetto agli operatori aritmetici, di concatenazione e di confronto.
Gli operatori con uguale precedenza vengono valutati da sinistra a destra nell'ordine in cui vengono visualizzati nell'espressione.
Ordine di precedenza
Gli operatori vengono valutati nell'ordine di precedenza seguente:
Operatore Await
Await
Operatori aritmetici e di concatenazioni
Elevamento a potenza (^
)
Identità e negazione unarie (+
, –
)
Moltiplicazione e divisione a virgola mobile (*
, /
)
Divisione di interi (\
)
Aritmetico modulare (Mod
)
Aggiunta e sottrazione (+
, –
)
Concatenazione di stringhe (&
)
Spostamento di bit aritmetico (<<
, >>
)
Operatori di confronto
Tutti gli operatori di confronto (=
, <>
, <
, <=
, >
, >=
, Is
, IsNot
, Like
, TypeOf
...Is
)
Operatori logici e bit per bit
Negazione (Not
)
Congiunzione (And
, AndAlso
)
Disgiunzione esclusiva (Or
, OrElse
)
Disgiunzione esclusiva (Xor
)
Commenti
L'operatore =
è solo l'operatore di confronto di uguaglianza, non l'operatore di assegnazione.
L'operatore di concatenazione di stringhe (&
) non è un operatore aritmetico, ma in precedenza viene raggruppato con gli operatori aritmetici.
Gli operatori Is
e IsNot
sono operatori di confronto dei riferimenti a oggetti. Non confrontano i valori di due oggetti; effettuano un controllo solo per determinare se due variabili oggetto fanno riferimento alla stessa istanza dell'oggetto.
Associatività
Quando operatori di uguale precedenza vengono visualizzati insieme in un'espressione, ad esempio la moltiplicazione e la divisione, il compilatore valuta ogni operazione man mano che le rileva da sinistra a destra. Ciò è illustrato nell'esempio seguente.
Dim n1 As Integer = 96 / 8 / 4
Dim n2 As Integer = (96 / 8) / 4
Dim n3 As Integer = 96 / (8 / 4)
La prima espressione valuta la divisione 96 / 8 (che restituisce 12) e quindi la divisione 12 / 4, che restituisce tre. Poiché il compilatore valuta le operazioni per n1
da sinistra a destra, la valutazione è la stessa quando tale ordine viene indicato in modo esplicito per n2
. Sia n1
che n2
hanno un risultato di tre. Al contrario, n3
ha un risultato di 48, perché le parentesi forzano il compilatore a valutare prima 8 / 4.
A causa di questo comportamento, gli operatori vengono considerati associativi a sinistra in Visual Basic.
Override di precedenza e associatività
È possibile usare le parentesi per forzare la valutazione di alcune parti di un'espressione prima di altre. In questo modo è possibile eseguire l'override dell'ordine di precedenza e dell'associatività rimasta. Visual Basic esegue sempre operazioni racchiuse tra parentesi prima di quelle esterne. Tuttavia, tra parentesi, mantiene la precedenza e l'associatività normali, a meno che non si usino altre parentesi tra parentesi. Ciò è illustrato nell'esempio seguente.
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.