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 i
essere 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.
i
sul lato sinistro di +=
è "memorizzato nella cache" prima che il lato destro venga valutato. Ciò è controintuitivo, poiché, ad esempio, richiederebbe un'operazione di copia se i
fosse un oggetto. (Per favore, non capirmi male: sono assolutamente d'accordo nel dichiarare che questa 0
è la risposta corretta e conforme agli standard.)