java-x = x 1和x的实现差异

我的教授最近说,尽管x = x 1和x显然会给出相同的结果,但是在JVM中实现它们的方式有所不同.这是什么意思?编译器不是吗:嘿,我看到x了,所以我将其切换为x = x 1并继续进行?

我怀疑在效率方面是否会有所差异,但如果组装在这些情况下有所不同,我将感到惊讶…

最佳答案

My professor recently said that although x = x + 1 and x++ will obviously give the same result

我猜你的教授也许是说-x = x 1和x之后的x值将是相同的.只是重新表述一下,因为它似乎在解释问题时造成了混乱.

好吧,尽管x的值相同,但是它们是不同的运算符,并且在字节码中使用不同的JVM指令. x 1使用iadd指令,而x使用iinc指令.尽管这取决于编译器.编译器可以自由地对特定操作使用不同的指令集.我已经针对javac编译器进行了检查.

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

I just tested it with my eclipse and it produced iinc for both expressions. So I found one compiler producing the same instructions

您可以使用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

转载注明原文:java-x = x 1和x的实现差异 - 代码日志