Espressioni

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:

  1. calcola il prodotto 3 * b e memorizza il risultato in una variabile temporanea
  2. calcola la somma a + (3 * b), e se necessario (a seconda delle caratteristiche della macchina sottostante) memorizza anche questo risultato in una variabile temporanea;
  3. assegna alla variabile i il risultato della somma

Si 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:

  1. si valuta l’assegnamento c = 3, che assegna il valore 3 alla variabile c e restituisce lo stesso valore;
  2. si valuta l’assegnamento b = (c = 3), che assegna a b il valore restituito c = 3, ovvero 3, e restituisce ancora lo stesso valore
  3. si valuta infine a = (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 è