Operatori | Associativita' | |
---|---|---|
() [] -> . | -> | da sinistra a destra |
! ~ ++ -- + - & * (tipo) sizeof | <- | da destra a sinistra |
* / % | -> | da sinistra a destra |
+ - | -> | da sinistra a destra |
<< >> | -> | da sinistra a destra |
< <= > >= | -> | da sinistra a destra |
== != | -> | da sinistra a destra |
& | -> | da sinistra a destra |
^ | -> | da sinistra a destra |
| | -> | da sinistra a destra |
&& | -> | da sinistra a destra |
|| | -> | da sinistra a destra |
?: | <- | da destra a sinistra |
= += -= *= /= %= &= ^= |= <<= >>= | <- | da destra a sinistra |
, | -> | da sinistra a destra |
espr_1 op espr_2il C lascia indefinito se verra' valutata prima espr_1 o prima espr_2.
i=0; c=a[i]+b[++i]; /* c = a[0] + b[1] OPPURE c = a[1] + b[1] ? */La risposta dell'esempio dipende dalla versione del compilatore!!!
int *p; int b[10]; p = b; /* *p equivale a b[0] */ *p++ = 5; /* b[0] = 5; *p equivale a b[1] */ p = b; *++p = 5; /* b[1] = 5; *p equivale a b[1] */ p = b; *p = 5; /* b[0] = 5 */ b[1] = ++*p; /* b[1] = 5; *b[0] = 6; *p equivale a b[0] */Nell'esempio appena riportato, sia l'operatore di dereferimento * che l'operatore di incremento ++ (sia che venga impiegato in forma postfissa, che in forma prefissa), hanno la stessa priorita' nelle precedenze degli operatori, ma la loro associativita' va da destra a sinistra.
In definitiva, si ha che:
Espressione | Equivale a: | Significato: |
---|---|---|
*p++ | *(p++) | p viene incrementato dopo del suo utilizzo per accedere alla memoria. |
*++p | *(++p) | p viene incrementato prima del suo utilizzo per accedere alla memoria. |
++*p | ++(*p) | p e' utilizzato per l'accesso alla memoria, ma il contenuto della locazione viene incrementato prima del suo utilizzo. |
(*p)++ | (*p)++ | p e' utilizzato per l'accesso alla memoria; il contenuto della locazione viene incrementato dopo del suo utilizzo. |
Conclusione: per una maggiore chiarezza (riscontrabile specialmente durante le fasi di manutenzione di un programma) e' consigliabile l'uso delle parentesi al fine di facilitarne la lettura e di evitare di far ricorso a regole sintattiche tipiche del linguaggio.