In cpp, das Ergebnis des folgenden Codeausschnitts ist: 5 5 5 Aber in Java ist das Ergebnis desselben Codeausschnitts: 3 5 7 Ich weiß nicht warum,
Weil C++ nicht Java ist :)
Sie mutieren die Variable v
in den letzten zwei Funktionsaufrufen. Schauen wir uns die Zerlegen aussehen (debug hier, um die Dinge klarer, in Freigabe ein statischer Wert von 5
verwendet wird, aber es ist auch 7
genauso gut sein könnte, Sie werden sehen, warum.):
h.fn(v).fn(v=5).fn((v=7));
00411565 mov dword ptr [v],7
0041156C mov dword ptr [v],5
00411573 mov eax,dword ptr [v]
00411576 push eax
Die Reihenfolge Es ist nicht garantiert, dass die Ausdruckauswertung die Reihenfolge ist, in der Sie die Funktionen hier aufrufen. Sie ändern v
zwischen sequence points. 7
wird v
zugeordnet, dann 5
, dann wird die erste Funktion aufgerufen. Beachten Sie, dass es nicht 7
und dann 5
in dieser Reihenfolge sein muss, es könnte ausgetauscht werden! Die Reihenfolge der Auswertung ist nicht spezifiziert, es könnte alles sein.
Sie haben eine Kette von Funktionen, die v
zweimal mutieren. Sie können sich nicht darauf verlassen, dass jede Mutation in der Reihenfolge erfolgt, in der Sie sie eingegeben haben.
Wir können es vereinfachen. Nehmen wir an, wir haben zwei Funktionen; x
und y
, die beide eine int
zurückgeben. Wenn ich schreibe:
int k = x() + y();
Es gibt keine Garantie dafür, dass x()
wird vor y()
aufgerufen werden. Wenn Sie also ein für beide Funktionen gemeinsames Argument mutieren, kann die Mutation zuerst im Aufruf von y()
auftreten, was Sie sehen.
Die kurze Antwort ist "C++ ist nicht Java." –
BTW, ich liebe Fragen, die mich einige Demontage zerlegen lassen. :) –