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

分析同上。

 

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