Condividi tramite


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 )

Vedere anche

Riferimenti

Operatori c