請寫出下列程序的運行結果:
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);
}
分析同上。