我的教授最近说,尽管x = x + 1
显然x++
会给出相同的结果,但它们在 JVM 中的实现方式存在差异。这是什么意思?编译器不是像:嘿,我明白x++
了,所以我将它切换到x = x + 1
并继续?
我怀疑在效率方面有什么不同,但如果在这些情况下组装会有所不同,我会感到惊讶......
我的教授最近说,虽然 x = x + 1 和 x++ 显然会给出相同的结果
我猜你的教授可能是说 - after和will的值是一样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
这两个表达式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 个不同的计算不能有相同的字节码。