1 Dicembre 2021
Expand search form

Quale operatore è considerato con la precedenza più alta?

La precedenza e l’associatività degli operatori C influenzano il raggruppamento e la valutazione degli operandi nelle espressioni. La precedenza di un operatore è significativa solo se sono presenti altri operatori con precedenza maggiore o minore. Le espressioni con operatori con precedenza più alta vengono valutate per prime. La precedenza può anche essere descritta dalla parola “binding”. Si dice che gli operatori con una precedenza più alta hanno un legame più stretto.

La seguente tabella riassume la precedenza e l’associatività (l’ordine in cui gli operandi sono valutati) degli operatori C, elencandoli in ordine di precedenza dal più alto al più basso. Dove diversi operatori appaiono insieme, hanno la stessa precedenza e sono valutati secondo la loro associatività. Gli operatori nella tabella sono descritti nelle sezioni che iniziano con Operatori Postfix. Il resto di questa sezione fornisce informazioni generali sulla precedenza e l’associatività.

Precedenza e associatività degli operatori C

Simbolo 1 Tipo di operazione Associatività
[ ] ( ) . ->
++ — (prefisso)
Espressione Da sinistra a destra
sizeof & * + –

1 Gli operatori sono elencati in ordine decrescente di precedenza. Se più operatori appaiono sulla stessa riga o in un gruppo, hanno la stessa precedenza.

2 Tutti gli operatori di assegnazione semplici e composti hanno la stessa precedenza.

Un’espressione può contenere diversi operatori con uguale precedenza. Quando diversi di questi operatori appaiono allo stesso livello in un’espressione, la valutazione procede secondo l’associatività dell’operatore, da destra a sinistra o da sinistra a destra. La direzione della valutazione non influisce sui risultati delle espressioni che includono più di un operatore di moltiplicazione ( * ), di addizione ( + ), o binario-bitwise ( & , | , o ^ ) allo stesso livello. L’ordine delle operazioni non è definito dal linguaggio. Il compilatore è libero di valutare tali espressioni in qualsiasi ordine, se può garantire un risultato coerente.

Solo gli operatori sequential-evaluation ( , ), logical-AND ( && ), logical-OR ( || ), conditional-expression ( ? : ), e function-call costituiscono punti di sequenza, e quindi garantiscono un particolare ordine di valutazione per i loro operandi. L’operatore di chiamata di funzione è l’insieme delle parentesi che seguono l’identificatore della funzione. L’operatore di valutazione sequenziale ( , ) è garantito per valutare i suoi operandi da sinistra a destra. (L’operatore virgola in una chiamata di funzione non è lo stesso dell’operatore di valutazione sequenziale e non fornisce alcuna garanzia del genere). Per maggiori informazioni, vedere Punti di sequenza.

Anche gli operatori logici garantiscono la valutazione dei loro operandi da sinistra a destra. Tuttavia, essi valutano il minor numero di operandi necessari per determinare il risultato dell’espressione. Questa è chiamata valutazione di “cortocircuito”. Così, alcuni operandi dell’espressione possono non essere valutati. Per esempio, nell’espressione

il secondo operando, y++ , viene valutato solo se x è vero (non zero). Così, y non viene incrementato se x è falso (0).

Esempi

La seguente lista mostra come il compilatore lega automaticamente diverse espressioni di esempio:

Espressione Legame automatico
a & b || c (a & b) || c
a = b || c a = (b || c)
q && r || s– (q && r) || s–

Nella prima espressione, l’operatore bitwise-AND ( & ) ha una precedenza maggiore dell’operatore logico-OR ( || ), quindi a & b forma il primo operando dell’operazione logico-OR.

Nella seconda espressione, l’operatore logico-OR ( || ) ha una precedenza maggiore dell’operatore di assegnazione semplice ( = ), quindi b || c è raggruppato come operando di destra nell’assegnazione. Notate che il valore assegnato ad a è 0 o 1.

La terza espressione mostra un’espressione formata correttamente che può produrre un risultato inaspettato. L’operatore logico-AND ( && ) ha una precedenza maggiore dell’operatore logico-OR ( || ), quindi q && r è raggruppato come operando. Poiché gli operatori logici garantiscono la valutazione degli operandi da sinistra a destra, q && r viene valutato prima di s– . Tuttavia, se q && r valuta un valore diverso da zero, s– non viene valutato, e s non viene decrementato. Se non decrementare s causerebbe un problema nel vostro programma, s– dovrebbe apparire come primo operando dell’espressione, o s dovrebbe essere decrementato in un’operazione separata.

La seguente espressione è illegale e produce un messaggio diagnostico in fase di compilazione:

Espressione illegale Raggruppamento predefinito
p == 0 ? p += 1: p += 2 ( p == 0 ? p += 1 : p ) += 2

In questa espressione, l’operatore di uguaglianza ( == ) ha la precedenza più alta, quindi p == 0 è raggruppato come operando. L’operatore di espressione condizionale ( ? : ) ha la precedenza successiva più alta. Il suo primo operando è p == 0 , e il suo secondo operando è p += 1 . Tuttavia, l’ultimo operando dell’operatore di espressione condizionale è considerato p piuttosto che p += 2 , poiché questa occorrenza di p si lega più strettamente all’operatore di espressione condizionale che all’operatore di assegnazione composta. Si verifica un errore di sintassi perché += 2 non ha un operando di sinistra. Dovreste usare le parentesi per prevenire errori di questo tipo e produrre codice più leggibile. Per esempio, potreste usare le parentesi come mostrato sotto per correggere e chiarire l’esempio precedente:

Articolo precedente

Come si chiama una finestra che si apre verso l’alto?

Articolo successivo

Come si ripara una crepa in un congelatore?

You might be interested in …

Qual è meglio Weber Genesis o spirito?

Weber Genesis e Spirit BBQ sono entrambi una scelta incredibile di BBQ così che cosa è la differenza e come si dovrebbe scegliere? Sia Weber Spirit che Genesis BBQ sono prodotti con materiali di alta […]

Quando si aggiunge Ness a una parola?

Sono un po’ confuso con questo suffisso -ness. Non so mai quando applicarlo. Per esempio questa parola mi ha confuso: impotenza. Sembra che questo suffisso possa essere usato in molti casi. E mi sembra che […]

Qual è il genere di 39 Clues Book 1?

“Il labirinto di ossa”, che manda una coppia di simpatici orfani in una caccia al tesoro in tutto il mondo, mostra un fascino lucido e ben congegnato. Il libro è la prima puntata di “The […]