Qual è la differenza tra *y++
e ++*y
?
Il significato di un'espressione in C è caratterizzato da due cose: ciò valore produce e quali effetti collaterali che produce.
Esaminiamo la prima espressione.
L'incremento postfisso ha una priorità più alta del dereferenziamento, quindi questo è *(y++)
.
L'incremento postfisso produce un effetto collaterale: modifica il valore di y
in modo che punti a un'altra posizione. L'incremento postfisso produce anche un valore: il valore che aveva prima di essere incrementato. L'operatore *
quindi denota quel valore per produrre un lvalue: cioè, qualcosa che è possibile utilizzare come variabile, da memorizzare o da cui recuperare.
Ho notato che l'effetto collaterale può verificarsi in qualsiasi momento prima o dopo il dereferenziamento. Se lei ha detto
q = *y++
quindi l'effetto collaterale della ++
potrebbe accadere in qualsiasi momento. Questo potrebbe essere:
q = *y;
y = y + 1;
o potrebbe essere trattato come
t = y;
y = y + 1;
q = *t;
Entrambi sono perfettamente legale. (Tranne naturalmente che se lo è esso stesso un'espressione con effetti collaterali, quegli effetti collaterali devono essere prodotti solo una volta. Per chiarezza, farò questa ipotesi per tutto il tempo.)
Che ne dici di ++*y
? È semplice: *y
produce una variabile, il contenuto della variabile viene incrementato e il valore dell'espressione è il valore incrementato. Si noti che di nuovo, l'effetto collaterale può essere prodotto fuori ordine:
q = ++*y
potevano essere considerati:
t = *y + 1;
*y = t;
q = t;
o come
t = *y + 1;
q = t;
*y = t;
Ricordare, C non produrre molte restrizioni sull'ordine in cui possono verificarsi effetti collaterali, quindi fai attenzione.
Pensa a '++ * y' e' * ++ y'. –
Vedo che hai a che fare con i puntatori, ma questo potrebbe aiutare: http://stackoverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java – zztops
Can not you semplicemente * esegui * quel programma trova la sua uscita? (Bene, se lo aggiusti per non avere un comportamento indefinito prima ...) –