Unterschied in der Implementierung von x = x + 1 und x ++

8

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 ...

    
Eleeist 22.10.2013, 20:29
quelle

2 Antworten

24
  

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:

%Vor%

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 ):

%Vor%     
Rohit Jain 22.10.2013, 20:32
quelle
7

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

%Vor%

Daher ist die Frage nach Bytecode bedeutungslos, weil 2 verschiedene Berechnungen nicht denselben Bytecode haben können.

    
Ingo 22.10.2013 20:33
quelle

Tags und Links