Jedyną prawidłową odpowiedzią na twoje pytanie jest: Ponieważ jest niezdefiniowana.
Ok, zanim wszyscy mnie spalicie ...
Wszyscy odpowiedzieliście, dlaczego wynik i+=i++
jest w porządku i logiczny i=0
.
Kusiło mnie, by oddać głos za każdą z twoich odpowiedzi, ale obliczona przeze mnie reputacja byłaby zbyt wysoka.
Dlaczego jestem taki zły na was, ludzie? nie z powodu tego, co wyjaśniają twoje odpowiedzi.
Chodzi mi o to, że każda odpowiedź, którą przeczytałem, podjęła niezwykły wysiłek, aby wyjaśnić niemożliwe, ja brawa!
Ale jaki jest wynik? czy to wynik intuicyjny - czy jest to wynik akceptowalny?
Każdy z was widział „nagiego króla” i jakoś zaakceptował go jako racjonalnego króla.
Wszyscy jesteście ŹLE!
i+=i++;
wynik w 0
jest niezdefiniowany.
błąd w mechanizmie oceny języka, jeśli chcesz ... lub nawet gorzej! błąd w projekcie.
chcesz dowód? oczywiście, że chcesz!
int t=0; int i=0; t+=i++; //t=0; i=1
To jest ... intuicyjny wynik! ponieważ najpierw oceniliśmy t
przypisano mu wartość i dopiero po dokonaniu oceny i przypisaniu mieliśmy do czynienia z operacją po - racjonalne, prawda?
czy to racjonalne, że: i=i++
i i=i
dać taki sam wynik i
?
podczas t=i++
i t=i
mają różne wyniki dla i
.
Operacja po jest czymś, co powinno się wydarzyć po ocenie instrukcji.
W związku z tym:
int i=0;
i+=i++;
Powinno być tak samo, gdybyśmy napisali:
int i=0;
i = i + i ++;
i dlatego taki sam jak:
int i=0;
i= i + i;
i ++;
i dlatego taki sam jak:
int i=0;
i = i + i;
i = i + 1;
Jakikolwiek wynik, który nie 1
wskazuje na błąd w kompilatorze lub błąd w projekcie języka, jeśli idziemy z racjonalnym myśleniem - jednak MSDN i wiele innych źródeł mówi nam „hej - to jest niezdefiniowane!”
Teraz, zanim przejdę dalej, nawet ten zestaw przykładów, które podałem, nie jest przez nikogo wspierany ani uznawany. Jednak to, co według intuicyjnego i racjonalnego sposobu powinno być wynikiem.
Koder nie powinien mieć wiedzy na temat pisania lub tłumaczenia zestawu.
Jeśli jest napisany w sposób niezgodny z definicjami języka - to błąd!
Na koniec skopiowałem to z Wikipedii, Operatory inkrementacji i dekrementacji :
Ponieważ operator inkrementacji / dekrementacji modyfikuje operand, użycie takiego operandu więcej niż jeden raz w ramach tego samego wyrażenia może dawać nieokreślone wyniki . Na przykład w wyrażeniach takich jak x - ++ x nie jest jasne, w jakiej kolejności należy wykonać operatory odejmowania i inkrementacji. Takie sytuacje są jeszcze gorsze, gdy kompilator stosuje optymalizacje, co może spowodować, że kolejność wykonywania operacji będzie inna niż zamierzona przez programistę.
I dlatego.
Prawidłowa odpowiedź brzmi: NIE NALEŻY UŻYWAĆ! (ponieważ jest NIEDEFINIOWANY!)
Tak .. - Ma nieprzewidywalne wyniki, nawet jeśli kompilator C # próbuje jakoś go znormalizować.
Nie znalazłem żadnej dokumentacji C # opisującej zachowanie, które wszyscy udokumentowaliście jako normalne lub dobrze zdefiniowane zachowanie języka. To, co znalazłem, jest dokładnie odwrotne!
[ skopiowane z dokumentacji MSDN dla operatorów przyrostowych i zmniejszających Postfix: ++ i - ]
Gdy operator postfiksu jest stosowany do argumentu funkcji, nie można zagwarantować , że wartość argumentu będzie zwiększana lub zmniejszana przed przekazaniem jej do funkcji. Więcej informacji znajduje się w sekcji 1.9.17 standardu C ++.
Zwróć uwagę, że te słowa nie są gwarantowane ...
Wybacz mi, jeśli ta odpowiedź wydaje się arogancka - nie jestem arogancką osobą. Po prostu uważam, że tysiące ludzi przyjeżdżają tutaj, aby się uczyć, a odpowiedzi, które czytam, wprowadzą ich w błąd i zaszkodzą ich logice i zrozumieniu tematu.