@somekind: 39 ma według mnie największy sens bo to odpowiada takim instrukcjom :
++a;
++a;
++a;
wynik = a + a + a;
Miałoby to sens, gdyby w specyfikacji było napisane, że najpierw wykonywane są wszystkie preinkrementacje, a potem wszystkie dodawania. Jeśli nie zostało to tak nigdzie zdefiniowane, to jest to wynik równie dobry jak każdy inny. Aczkolwiek dość nieintuicyjne byłoby zachowanie łamiące naturalną kolejność działań i precedens operatorów.
Natomiast w C# jest tak :
wynik = (a + 1 ) + ( a + ( 1 + 1)) + (a + (1 + 1 + 1)); - tak jakbyśmy mieli kilka instancji tej samej zmiennej i każda ma inną wartość
To wynika z opisanego w specyfikacji działania operatora preinkrementacji, który zwraca zmienną po zmianie oraz faktu, że dodawanie wykonywane jest od lewej do prawej, a więc najpierw zwiększamy, potem dodajemy znowu zwiększoną, a na końcu do sumy tych dwóch dodajemy zwiększoną trzeci raz.
Wniosek jest taki że lepiej nie zmieniać więcej niż 1 raz wartości tego samego operanda w jednym wyrażeniu bo każdy kompilator może liczyć inaczej.
W C++ tak. W językach, w których jest to precyzyjnie zdefiniowane problemu nie ma.