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

问题描述 投票:0回答:3

我的教授最近说,虽然

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

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

java bytecode
3个回答
29
投票

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

我猜你的教授的意思可能是 -

x
x = 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

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个不同的计算不可能有相同的字节码。


0
投票

显然给出相同的结果”这一说法(显然?)是错误的:

差异

结果不一样:

int x = 10;
int a = x++; // a = 10
int x = 10;
int b = x = x + 1; // b = 11

编译错误

如果

x = x + 1

 的类型既不是 
x
 也不是 
int
long

将无法编译
byte x = 10;
x = x + 1; // incompatible types: possible lossy conversion from int to byte

字节码

生成的字节码是否相同主要取决于编译器实现;甚至可能取决于这些表达式的使用方式 - 是需要结果,还是只是

x
的值。
您可以使用
javap
检查编译器的字节码。

© www.soinside.com 2019 - 2024. All rights reserved.