Precedenza e ordine di valutazionePrecedence and Order of Evaluation

La precedenza e l'associatività degli operatori C influiscono sul raggruppamento e sulla valutazione degli operandi nelle espressioni.The precedence and associativity of C operators affect the grouping and evaluation of operands in expressions. La precedenza d un operatore è significativa solo se sono presenti altri operatori con precedenza più alta o più bassa.An operator's precedence is meaningful only if other operators with higher or lower precedence are present. Le espressioni con operatori con precedenza più alta vengono valutate per prime.Expressions with higher-precedence operators are evaluated first. La precedenza può essere descritta anche con la parola "associazione".Precedence can also be described by the word "binding." Gli operatori con precedenza maggiore vengono definiti con associazione più forte.Operators with a higher precedence are said to have tighter binding.

Nella tabella seguente vengono riepilogati la precedenza e l'associatività (l'ordine in cui gli operandi vengono valutati) degli operatori C, elencandoli in ordine di precedenza a partire da quella più alta.The following table summarizes the precedence and associativity (the order in which the operands are evaluated) of C operators, listing them in order of precedence from highest to lowest. Quando più operatori vengono visualizzati insieme, hanno precedenza uguale e vengono valutati in base all'associatività.Where several operators appear together, they have equal precedence and are evaluated according to their associativity. Gli operatori nella tabella sono descritti nelle sezioni a partire da Forma suffissa degli operatori.The operators in the table are described in the sections beginning with Postfix Operators. Nella parte rimanente della sezione vengono fornite informazioni generali sulla precedenza e sull'associatività.The rest of this section gives general information about precedence and associativity.

Precedenza e associatività degli operatori CPrecedence and Associativity of C Operators

Simbolo 1Symbol 1 Tipo di operazioneType of Operation AssociazioneAssociativity
[ ] ( ) . ->[ ] ( ) . ->

++ -- (postfix)++ -- (postfix)
EspressioneExpression Da sinistra a destraLeft to right
sizeof & * + - ~ !sizeof & * + - ~ !

++ -- (prefix)++ -- (prefix)
UnarioUnary Da destra a sinistraRight to left
cast di tipotypecasts UnarioUnary Da destra a sinistraRight to left
* / %* / % MoltiplicazioneMultiplicative Da sinistra a destraLeft to right
+ -+ - AddizioneAdditive Da sinistra a destraLeft to right
<< >> Spostamento bit per bitBitwise shift Da sinistra a destraLeft to right
< > <= >=< > <= >= RelazionaleRelational Da sinistra a destraLeft to right
== !=== != UguaglianzaEquality Da sinistra a destraLeft to right
& AND bit per bitBitwise-AND Da sinistra a destraLeft to right
^ OR esclusivo bit per bitBitwise-exclusive-OR Da sinistra a destraLeft to right
|| OR inclusivo bit per bitBitwise-inclusive-OR Da sinistra a destraLeft to right
&& AND logicoLogical-AND Da sinistra a destraLeft to right
|||| OR logicoLogical-OR Da sinistra a destraLeft to right
? :? : Espressione condizionaleConditional-expression Da destra a sinistraRight to left
= *= /= %== *= /= %=

+= -= <<= >>= &=+= -= <<= >>= &=

^= |=^= |=
Assegnazione semplice e composta 2Simple and compound assignment 2 Da destra a sinistraRight to left
,, Valutazione sequenzialeSequential evaluation Da sinistra a destraLeft to right
  1. Gli operatori sono elencati in ordine decrescente di precedenza.Operators are listed in descending order of precedence. Se alcuni operatori sono nella stessa riga o in un gruppo, hanno uguale precedenza.If several operators appear on the same line or in a group, they have equal precedence.

  2. Tutti gli operatori di assegnazione semplice e composta hanno uguale precedenza.All simple and compound-assignment operators have equal precedence.

    Un'espressione può contenere numerosi operatori con uguale precedenza.An expression can contain several operators with equal precedence. Quando più operatori sono allo stesso livello in un'espressione, la valutazione continua in base all'associatività dell'operatore, sia da destra a sinistra che da sinistra a destra.When several such operators appear at the same level in an expression, evaluation proceeds according to the associativity of the operator, either from right to left or from left to right. La direzione della valutazione non influisce sui risultati delle espressioni che includono più di un operatore di moltiplicazione (\), di addizione (+) o binario bit per bit (& | ^) allo stesso livello.The direction of evaluation does not affect the results of expressions that include more than one multiplication (**), addition (+), or binary-bitwise (& | ^**) operator at the same level. L'ordine delle operazioni non è definito dal linguaggio.Order of operations is not defined by the language. Il compilatore è libero di valutare tali espressioni in qualsiasi ordine, se può garantire un risultato coerente.The compiler is free to evaluate such expressions in any order, if the compiler can guarantee a consistent result.

    Solo gli operatori di valutazione sequenziale (,), AND logico (&&), OR logico (||), espressione condizionale (? :) e di chiamata di funzione costituiscono punti di sequenza e pertanto garantiscono un determinato ordine di valutazione per i relativi operandi.Only the sequential-evaluation (,), logical-AND (&&), logical-OR (||), conditional-expression (? :), and function-call operators constitute sequence points and therefore guarantee a particular order of evaluation for their operands. L'operatore di chiamata di funzione è un set di parentesi che seguono l'identificatore della funzione.The function-call operator is the set of parentheses following the function identifier. L'operatore di valutazione sequenziale (,) garantisce la valutazione dei propri operandi da sinistra a destra.The sequential-evaluation operator (,) is guaranteed to evaluate its operands from left to right. Si noti che l'operatore virgola in una chiamata di funzione non equivale all'operatore di valutazione sequenziale e non fornisce una garanzia analoga. Per alte informazioni, vedere Punti di sequenza.(Note that the comma operator in a function call is not the same as the sequential-evaluation operator and does not provide any such guarantee.) For more information, see Sequence Points.

    Anche gli operatori logici garantiscono la valutazione dei propri operandi da sinistra a destra.Logical operators also guarantee evaluation of their operands from left to right. Tali operatori valutano tuttavia il minor numero di operandi necessari per determinare il risultato dell'espressione.However, they evaluate the smallest number of operands needed to determine the result of the expression. Questa condizione viene denominata anche "valutazione short circuit".This is called "short-circuit" evaluation. Alcuni operandi dell'espressione potrebbero pertanto non essere valutati.Thus, some operands of the expression may not be evaluated. Ad esempio, nell'espressioneFor example, in the expression

x && y++

il secondo operando, y++, viene valutato solo se x è true (diverso da zero).the second operand, y++, is evaluated only if x is true (nonzero). Di conseguenza, y non viene incrementato se x è false (0).Thus, y is not incremented if x is false (0).

EsempiExamples

Nell'elenco seguente viene mostrato il modo in cui il compilatore associa automaticamente diverse espressioni di esempio:The following list shows how the compiler automatically binds several sample expressions:

EspressioneExpression Associazione automaticaAutomatic Binding
a & b || ca & b || c (a & b) || c(a & b) || c
a = b || ca = b || c a = (b || c)a = (b || c)
q && r || s--q && r || s-- (q && r) || s--(q && r) || s--

Nella prima espressione l'operatore AND bit per bit (&) ha precedenza più alta rispetto all'operatore OR logico (||), quindi a & b forma il primo operando dell'operazione di OR logico.In the first expression, the bitwise-AND operator (&) has higher precedence than the logical-OR operator (||), so a & b forms the first operand of the logical-OR operation.

Nella seconda espressione l'operatore OR logico (||) ha precedenza più alta rispetto all'operatore di assegnazione semplice (=), quindi b || c viene raggruppato come operando destro nell'assegnazione.In the second expression, the logical-OR operator (||) has higher precedence than the simple-assignment operator (=), so b || c is grouped as the right-hand operand in the assignment. Si noti che il valore assegnato a a è 0 o 1.Note that the value assigned to a is either 0 or 1.

La terza espressione mostra un'espressione formata correttamente che può restituire un risultato imprevisto.The third expression shows a correctly formed expression that may produce an unexpected result. L'operatore AND logico (&&) ha precedenza più alta rispetto all'operatore OR logico (||), quindi q && r viene raggruppato come operando.The logical-AND operator (&&) has higher precedence than the logical-OR operator (||), so q && r is grouped as an operand. Poiché gli operatori logici garantiscono la valutazione degli operandi da sinistra a destra, q && r viene valutato prima di s--.Since the logical operators guarantee evaluation of operands from left to right, q && r is evaluated before s--. Tuttavia, se q && r restituisce un valore diverso da zero, s-- non viene valutato e s non viene decrementato.However, if q && r evaluates to a nonzero value, s-- is not evaluated, and s is not decremented. Se la mancata diminuzione di s causa un problema nel programma, s-- deve essere visualizzato come primo operando dell'espressione o s deve essere decrementato in un'operazione separata.If not decrementing s would cause a problem in your program, s-- should appear as the first operand of the expression, or s should be decremented in a separate operation.

La seguente espressione non è valida e restituisce un messaggio di diagnostica in fase di compilazione:The following expression is illegal and produces a diagnostic message at compile time:

Espressione non validaIllegal Expression Raggruppamento predefinitoDefault Grouping
p == 0 ?p == 0 ? p += 1: p += 2p += 1: p += 2 ( p == 0 ?( p == 0 ? p += 1 : p ) += 2p += 1 : p ) += 2

In questa espressione, l'operatore di uguaglianza (==) ha la precedenza più alta, pertanto p == 0 viene raggruppato come operando.In this expression, the equality operator (==) has the highest precedence, so p == 0 is grouped as an operand. L'operatore di espressione condizionale (? :) è quello con il valore di precedenza successivo.The conditional-expression operator (? :) has the next-highest precedence. In questo caso, il primo operando è p == 0, mentre il secondo è p += 1.Its first operand is p == 0, and its second operand is p += 1. Tuttavia, il secondo operando dell'operatore di espressione condizionale è considerato p anziché p += 2, poiché questa occorrenza di p esegue l'associazione in modo più forte all'operatore di espressione condizionale rispetto a quello di assegnazione composta.However, the last operand of the conditional-expression operator is considered to be p rather than p += 2, since this occurrence of p binds more closely to the conditional-expression operator than it does to the compound-assignment operator. Si verifica un errore di sintassi verifica perché in += 2 non è presente un operando sinistro.A syntax error occurs because += 2 does not have a left-hand operand. Per evitare errori di questo tipo e produrre codice più leggibile, è necessario utilizzare le parentesi.You should use parentheses to prevent errors of this kind and produce more readable code. È ad esempio possibile utilizzare le parentesi come illustrato di seguito per correggere e chiarire l'esempio precedente:For example, you could use parentheses as shown below to correct and clarify the preceding example:

( p == 0 ) ? ( p += 1 ) : ( p += 2 )

Vedere ancheSee Also

Operatori CC Operators