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

时间:2013-10-22 20:29:33

标签: java bytecode

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

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

2 个答案:

答案 0 :(得分:26)

  

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

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

好吧,虽然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

答案 1 :(得分:7)

两个表达式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种不同的计算不能具有相同的字节码。