Dalla standard (sezione 6.5.16.2, punto 3):
un'assegnazione composto della forma E1op=E2 differisce dalla semplice espressione di assegnamento * E1 = E1op(E2) solo in quanto il lvalue E1 viene valutato solo una volta.
Cioè, se invece si sta facendo
*a += 1
sarà solo determinare la posizione di destinazione una volta invece di due volte. Per le variabili "semplici" come nel tuo esempio, potrebbe non fare molta differenza. Naturalmente, se il compilatore sa che non è necessario farlo due volte, può comunque ottimizzare e farlo una sola volta. Nel caso ci siano altre entità che possono cambiare il puntatore (come un altro thread), c'è una vera differenza.
EDIT: Forse un esempio migliore è qualcosa di strano nel modo seguente (abusando del fatto che & b == & a-1 nel mio caso):
int a, b, *p;
a = 1; b = 5; p = &a;
*p += (--p == &b) ? 1 : 0;
printf("%d %d\n",a,b); // prints 1 6, because --p happens first, then *p
a = 1; b = 5; p = &a;
*p = *p + ((--p == &b) ? 1 : 0);
printf("%d %d\n",a,b); // prints 1 2, because the second *p is evaluated first,
// then --p and then the first *p
sì, il secondo riguarda più la digitazione .... –
Che differenza ti aspetti? Differenza in quale contesto? La tua domanda è off-topic senza quelle osservazioni. – 2501
Come internamente processo –