Prendi il seguente codice (utilizzabile come applicazione console):
static void Main(string[] args)
{
int i = 0;
i += i++;
Console.WriteLine(i);
Console.ReadLine();
}
Il risultato iè 0. Mi aspettavo 2 (come hanno fatto alcuni miei colleghi). Probabilmente il compilatore crea una sorta di struttura che risulta iessere zero.
Il motivo per cui mi aspettavo 2 è che, nella mia linea di pensiero, l'istruzione della mano destra verrebbe valutata per prima, incrementando i di 1. Di quanto non venga aggiunto a i. Dato che io sono già 1, sta aggiungendo 1 a 1. Quindi 1 + 1 = 2. Ovviamente non è quello che sta succedendo.
Puoi spiegare cosa fa il compilatore o cosa succede in fase di esecuzione? Perché il risultato è zero?
Disclaimer: sono assolutamente consapevole che non utilizzerai (e probabilmente non dovresti) questo codice. So che non lo farò mai. Tuttavia, trovo interessante sapere perché agisce in questo modo e cosa sta succedendo esattamente.
isul lato sinistro di +=è "memorizzato nella cache" prima che il lato destro venga valutato. Ciò è controintuitivo, poiché, ad esempio, richiederebbe un'operazione di copia se ifosse un oggetto. (Per favore, non capirmi male: sono assolutamente d'accordo nel dichiarare che questa 0è la risposta corretta e conforme agli standard.)