我的教授最近说,尽管x = x + 1
和x++
显然会给出相同的结果,但是在JVM中实现它们的方式有所不同。这是什么意思?编译器不是吗:嘿,我看到x++
了,所以我将其切换为x = x + 1
并继续吗?
我怀疑在效率方面是否存在差异,但是如果组装在这些情况下会有所不同,我将感到惊讶...
最佳答案
我想您的教授也许是想说-x
和x = x + 1
之后的x++
的值将是相同的。只是重新表述一下,因为它似乎在解释问题时造成了困惑。
好吧,尽管x
的值将相同,但是它们是不同的运算符,并且在字节码中使用不同的JVM指令。 x + 1
使用 iadd
指令,而x++
使用 iinc
指令。尽管这取决于编译器。编译器可以自由地对特定操作使用不同的指令集。我已经针对javac
编译器进行了检查。
对于eclipse编译器,来自@Holger的以下注释之一:
您可以使用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