Precedenza e ordine di valutazione
La precedenza e l'associazione degli operatori c# influiscono sul raggruppamento e la valutazione degli operandi nelle espressioni.Una precedenza degli operatori è significativa solo se altri operatori con precedenza più elevata o inferiore sono presenti.Le espressioni con gli operatori con precedenza più alta vengono valutate per prime.La precedenza può essere descritta la parola “che associa„. Gli operatori con una precedenza più elevata causate da disporre di associazione più severa.
Nella tabella seguente vengono riepilogati la precedenza e l'associazione (l'ordine in cui gli operandi vengono valutati) degli operatori c#, elencandole in ordine di priorità da più elevato quanto più in basso.Dove diversi operatori vengono visualizzati insieme, hanno precedenza uguale e vengono valutati in base all'associazione.Gli operatori nella tabella sono descritti nelle sezioni a partire da operatori di suffisso.Il resto di questa sezione vengono fornite informazioni generali su precedenza e l'associazione.
Precedenza e associatività degli operatori c#
Symbol1 |
tipo di operazione |
Associazione |
---|---|---|
[ ] ( ) . - > suffisso ++ e suffisso ovvero |
Espressione |
Da sinistra a destra |
prefisso ++ e prefisso ovvero sizeof & * + – ~ ! |
Unario |
Da destra a sinistra |
typecasts |
Unario |
Da destra a sinistra |
* / % |
Moltiplicazione |
Da sinistra a destra |
+ – |
Addizione |
Da sinistra a destra |
<< >> |
spostamento bit per bit |
Da sinistra a destra |
< > <= >= |
relazionale |
Da sinistra a destra |
== != |
Uguaglianza |
Da sinistra a destra |
& |
AND bit per bit |
Da sinistra a destra |
^ |
Bit per bit-esclusivo-O |
Da sinistra a destra |
| |
Bit per bit-incluso-O |
Da sinistra a destra |
&& |
AND logico |
Da sinistra a destra |
|| |
Logico-O |
Da sinistra a destra |
?: |
espressione condizionale |
Da destra a sinistra |
= *= /= %= += - = <<= >>=&= ^= |= |
assignment2 semplice e composto |
Da destra a sinistra |
, |
valutazione sequenziale |
Da sinistra a destra |
1.gli operatori sono elencati in ordine decrescente di precedenza.Se alcuni operatori sono nella stessa riga o in un gruppo, hanno precedenza uguale.
2.tutti gli operatori di assegnazione composta e semplici hanno precedenza uguale.
Un'espressione può contenere numerosi operatori con precedenza uguale.Quando vari tali operatori sono allo stesso livello in un'espressione, la valutazione viene eseguita l'associazione a seconda dell'operatore, da destra a sinistra o da sinistra a destra.La direzione della valutazione non influisce sui risultati dell'espressione che includono più di una moltiplicazione (*), aggiunta (+), o binario-bit per bit (**& | ^**operatore) allo stesso livello.L'ordine delle operazioni non è definita dal linguaggio.Il compilatore è libero di valutare tali espressioni in qualsiasi ordine, se il compilatore può garantire un risultato coerente.
Solo la sequenziale-valutazione (,AND logico ()&&), (logico-O||), (espressione condizionale**? :) e operatori di chiamata di funzione costituiscono i punti di sequenza e pertanto garantire un determinato ordine di valutazione per i propri operandi.L'operatore di chiamata di funzione è il set di parentesi che seguono l'identificatore della funzione.l'operatore di sequenziale-valutazione (,**) è garantito per valutare i propri operandi da sinistra a destra.Si noti che l'operatore virgola in una chiamata di funzione non è lo stesso dell'operatore di sequenziale-valutazione e non fornisce alcuna garanzia). Per ulteriori informazioni, vedere punti di sequenza.
Gli operatori logici e garantiscono la valutazione degli operandi da sinistra a destra.Tuttavia, valutare il minore numero di operandi necessari per determinare il risultato dell'espressione.Si tratta di valutazione di “valutazione short circuit„.Pertanto, operandi dell'espressione non possono essere valutate.Ad esempio, nell'espressione
x && y++
il secondo operando, y++, viene valutato solo se x è true (diverso da zero).Pertanto, y non viene incrementato se x è false (0).
Esempi
Nell'elenco come il compilatore associa automaticamente diverse espressioni di esempio:
Espressione |
associazione automatica |
---|---|
a & b || c |
(a & b) || c |
a = b || c |
a = (b || c) |
q && r || s-- |
(q && r) || s–– |
Nella prima espressione, l'operatore AND bit per bit (&) ha maggiore precedenza dell'operatore OR logico (||), quindi a & b forma il primo operando dell'operazione di OR logico.
Nella seconda espressione, l'operatore OR logico (||) ha maggiore precedenza dell'operatore di semplice-assegnazione (=), quindi b || c viene raggruppato come operando destro nell'assegnazione.Si noti che il valore assegnato a a è 0 o 1.
La terza espressione seguente viene illustrata un'espressione correttamente ancora in grado di fornire un risultato imprevisto.Operatore AND logico (&&) ha maggiore precedenza dell'operatore OR logico (||), quindi q && r viene raggruppato come operando.La valutazione di garanzie degli operatori logici degli operandi da sinistra a destra, q && r vengono valutate prima s––.tuttavia, se q && r restituisce un valore diverso da zero, s–– non viene valutato e s non viene decrementato.Se non decremento s provocherebbe un problema nel programma, s–– verrà visualizzato come primo operando dell'espressione, o s deve essere diminuisce operazione separata.
La seguente espressione non è valida e scrive un messaggio diagnostico in fase di compilazione:
Espressione non valida |
raggruppamento predefinito |
---|---|
p == 0 ? p += 1: p += 2 |
( p == 0 ? p += 1 : p ) += 2 |
in questa espressione, l'operatore di uguaglianza (==) ha la massima precedenza, pertanto p == 0 viene raggruppato come operando.Operatore di espressione condizionale (? :) ha la precedenza seguente-più elevata.Il primo operando è p == 0e il secondo operando è p += 1.Tuttavia, l'ultimo operando dell'operatore di espressione condizionale è considerato p anziché p += 2, da questa occorrenza di p associare più vicina all'utente di espressione condizionale che consente all'operatore di assegnazione composta.un errore di sintassi si verifica perché += 2 non dispone di un operando sinistro.È consigliabile utilizzare le parentesi per evitare errori del codice più leggibile products e del tipo.Ad esempio, è possibile utilizzare le parentesi come illustrato di seguito per correggere e chiarire l'esempio precedente:
( p == 0 ) ? ( p += 1 ) : ( p += 2 )