x = x + 1和x ++的实现差异

我的教授最近说过,虽然x = x + 1x++显然会给出相同的结果,但它们在JVM中的实现方式却有所不同。 这是什么意思? 是不是编译器:嘿,我看到x++所以我将它切换到x = x + 1并继续?

我怀疑在效率方面有什么不同,但如果在这些情况下assembly会有所不同,我会感到惊讶……

我的教授最近说过,虽然x = x + 1和x ++显然会给出相同的结果

我想你的教授也许意味着 – x = x + 1x++之后x = x + 1的值将是相同的 。 只是为了重新表达,因为它似乎在解释问题时产生了混乱。

好吧,虽然x的值相同,但它们是不同的运算符,并且在字节码中使用不同的JVM指令。 x + 1使用iadd指令,而x++使用iinc指令。 虽然这是依赖于编译器的。 编译器可以为特定操作使用不同的指令集。 我已经对javac编译器进行了检查。

对于eclipse编译器,来自@Holger的以下注释之一:

我只是用我的eclipse测试它,它为两个表达式生成了iinc 。 所以我发现一个编译器生成相同的指令

您可以使用javap命令检查字节代码。 我们考虑以下课程:

 class Demo { public static void main(String[] args) { int x = 5; x = x + 1; System.out.println(x); x++; System.out.println(x); } } 

编译上面的源文件,然后运行以下命令:

 javap -c Demo 

代码将被编译为以下字节码(仅显示main方法):

  public static void main(java.lang.String[]); Code: 0: iconst_5 1: istore_1 2: iload_1 3: iconst_1 4: iadd 5: istore_1 6: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 9: iload_1 10: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 13: iinc 1, 1 16: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 19: iload_1 20: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 23: return 

两个表达式x++x=x+1不会给出相同的结果,你的教授是错的(或者你把它与++x混淆了,这又是不同的)。 看到这个

 void notthesame() { int i = 0; System.out.println(i = i + 1); i = 0; System.out.println(i++); System.out.println("See?"); } 

因此,字节码的问题毫无意义,因为2个不同的计算不能具有相同的字节码。