EDIT: Okay, verstanden.
Der erste Punkt ist, dass Sie diesen Code offensichtlich sowieso nicht verwenden sollten. Wenn Sie es jedoch erweitern, entspricht es:
j = j ^ (i = i ^ (j = j ^ i));
(Wenn wir einen komplizierteren Ausdruck wie verwenden foo.bar++ ^= i
würden, wäre es wichtig, dass der ++
nur einmal ausgewertet wurde, aber hier glaube ich, dass es einfacher ist.)
Die Reihenfolge der Auswertung der Operanden ist immer von links nach rechts. Zunächst erhalten wir also:
j = 36 ^ (i = i ^ (j = j ^ i));
Dies (oben) ist der wichtigste Schritt. Wir haben 36 als LHS für die zuletzt ausgeführte XOR-Operation erhalten. Die LHS ist nicht "der Wert j
nach der Auswertung der RHS".
Die Auswertung der RHS des ^ beinhaltet den Ausdruck "One Level Nested", also wird es:
j = 36 ^ (i = 25 ^ (j = j ^ i));
Wenn wir dann die tiefste Ebene der Verschachtelung betrachten, können wir beide ersetzen i
und j
:
j = 36 ^ (i = 25 ^ (j = 25 ^ 36));
... was wird
j = 36 ^ (i = 25 ^ (j = 61));
Die Zuordnung zu j
in der RHS erfolgt zuerst, aber das Ergebnis wird dann am Ende trotzdem überschrieben, sodass wir das ignorieren können - es gibt keine weiteren Auswertungen j
vor der endgültigen Zuordnung:
j = 36 ^ (i = 25 ^ 61);
Dies entspricht nun:
i = 25 ^ 61;
j = 36 ^ (i = 25 ^ 61);
Oder:
i = 36;
j = 36 ^ 36;
Welches wird:
i = 36;
j = 0;
Ich denke , das ist alles richtig und es kommt zur richtigen Antwort ... Entschuldigung an Eric Lippert, wenn einige Details zur Bewertungsreihenfolge leicht abweichen :(