Mein Professor hat kürzlich gesagt, dass, obwohl x = x + 1
und x++
offensichtlich das gleiche Ergebnis liefern werden, es einen Unterschied gibt, wie sie in der JVM implementiert sind. Was heißt das? Ist Compiler nicht wie: hey, ich sehe x++
, also werde ich es zu x = x + 1
wechseln und weitermachen?
Ich bezweifle, dass es einen Unterschied gibt, wenn es um Effizienz geht, aber ich wäre überrascht, wenn die Montage in diesen Fällen anders wäre ...
Mein Professor hat vor kurzem gesagt, dass, obwohl x = x + 1 und x ++, offensichtlich das gleiche Ergebnis liefern werden
Ich nehme an, Ihr Professor meinte vielleicht - der Wert von x
nach x = x + 1
und x++
ist gleich . Nur um es neu zu formulieren, denn es scheint Verwirrung bei der Interpretation der Frage zu schaffen.
Nun, obwohl der Wert von x
gleich ist, sind sie verschiedene Operatoren und verwenden unterschiedliche JVM-Anweisungen in Bytecode. x + 1
verwendet die Anweisung iadd
, während x++
iinc
Anleitung. Obwohl dies compilerabhängig ist. Ein Compiler kann für eine bestimmte Operation einen anderen Befehlssatz verwenden. Ich habe dies gegen javac
Compiler überprüft.
Für Eclipse Compiler, aus einem der folgenden Kommentare von @Holger:
Ich habe es gerade mit meiner Eclipse getestet und es hat
iinc
für beide Ausdrücke erzeugt. So fand ich einen Compiler, der die gleichen Anweisungen erzeugt.
Sie können den Bytecode mit dem Befehl javap
überprüfen. Betrachten wir die folgende Klasse:
Kompilieren Sie die obige Quelldatei, und führen Sie den folgenden Befehl aus:
%Vor% Der Code wird in den folgenden Bytecode kompiliert (zeigt nur die Methode main
):
Die beiden Ausdrücke x++
und x=x+1
ergeben nicht das gleiche Ergebnis, Ihr Professor ist falsch (oder Sie haben das mit ++x
verwechselt, was wiederum anders ist).
Um dies zu sehen
Daher ist die Frage nach Bytecode bedeutungslos, weil 2 verschiedene Berechnungen nicht denselben Bytecode haben können.