请写出下列程序的运行结果:
public class Main {
public static void main(String[] args) {
int i = 3;
i *= ++i;
System.out.println(i);
}
}
答案:12
解析:
这道题有些人可能会觉得输出的是16,因为++之后,i不就变成了4吗?4乘以4等于16,其实并非如此!那为什么会等于12而不等于16呢,这和java的编译机制有关。
首先我们把这个程序生成的.class文件直接拖到idea编译器上就可以看到这个程序的编译过程:
public static void main(String[] args) {
int i = 3;
byte var10000 = i;
int i = i + 1;
i = var10000 * i;
System.out.println(i);
}
我们可以看到,原来的变量i被赋值给了一个临时变量var10000,然后i自增,最后是i等于临时变量var10000和i相乘,++i之后,i的值确实是变成了4,但是i = i *++i 中被标红色的i是临时变量var10000,临时变量var10000的值没有被改变,所以结果为12。
顺便说一下,如果在C++中运行的话,结果是16,这是不同的编程语言自己设定的一种编译机制。
把++i改成i++:
public class Main {
public static void main(String[] args) {
int i = 3;
i *= ++i;
System.out.println(i);
}
}
运行结果是:9
我们再次把这个程序生成的.class文件直接拖到idea编译器上看到的是下面的代码:
public static void main(String[] args) {
int i = 3;
byte var10000 = i;
byte var10001 = i;
int i = i + 1;
i = var10000 * var10001;
System.out.println(i);
}
分析同上。