In C un’espressione è costituita da una combinazione di operandi e operatori che rispetta le regole sintattiche del linguaggio. Il valore di un’espressione è univocamente determinato dai valori assunti dagli operandi, dal significato degli operatori e dalle regole di precedenza e associatività di questi ultimi.
Ad esempio, l’espressione
i = a + 3 * b
è formata da 4 operandi (i, a, 3, b
) e 3 operatori binari infissi (=, +, *
). Siccome l’operatore *
ha precedenza maggiore di +
, che a sua volta ha precedenza maggiore di =
, quest’espressione viene interpretata come:
i = (a + (3 * b))
Allora, per valutare l’espressione, il compilatore emette del codice che:
3 * b
e memorizza il risultato in una variabile temporaneaa + (3 * b)
, e se necessario (a seconda delle caratteristiche della macchina sottostante) memorizza anche questo risultato in una variabile temporanea;i
il risultato della sommaSi osservi che in C, a differenza di altri linguaggi, l’assegnamento è appunto un operatore (con precedenza molto bassa e associatività da destra a sinstra), che come ogni operatore restituisce un valore: il valore assunto dall’operando destro, ovvero il valore assegnato all’operando sinistro. Ciò permette la scrittura di assegnamenti a cascata: ad esempio, l’espressione
a = b = c = 3
viene interpretata come
a = (b = (c = 3))
e la sua valutazione avviene come segue:
c = 3
, che assegna il valore 3
alla variabile c
e restituisce lo stesso valore;b = (c = 3)
, che assegna a b
il valore restituito c = 3
, ovvero 3
, e restituisce ancora lo stesso valorea = (b = (c = 3))
, che ancora una volta assegna (ad a
) e restituisce il valore 3
, poichè questo è il valore restituito dall’operando destro, b = (c = 3))
Un altro esempio è