Java基础面试题之++i / ++i

请写出下列程序的运行结果: 

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);
    }

分析同上。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章