自增(++):將變量的值加1,分前綴式(如++i)和后綴式(如i++)。前綴式是先加1再使用;后綴式是先使用再加1。
自減(--):將變量的值減1,分前綴式(如--i)和后綴式(如i--)。前綴式是先減1再使用;后綴式是先使用再減1。
我們先從問題入手:
int i = 0; int j = i++; int k = --i;
分析結果:int j=i++;是后綴式,因此i的值先被賦予j,然后再自增1,所以這行代碼運行后,i=1、j=0;而int k=--i;是前綴式,因此i先自減1,然后再將它的值賦予k,因此這行代碼運行后,i=0、k=0。
int i = 0; int j = i++ + ++i; //相當於0 + 2 int k = --i + i--; //相當於1 + 1
代碼運行后,i等於多少?j等於多少?k等於多少?
結果:
分析結果:對於int j=i++ + ++i;,首先運行i++,i的值0被用於加運算(+),之后i自增值變為1,然后運行++i,i先自增變為2,之后被用於加運算,最后將i兩次的值相加的結果0+2=2賦給j,因此這行代碼運行完畢后i=2、j=2;對於int k=--i + i--;用一樣的思路分析,具體過程在此不再贅述,結果應該是i=0、k=2。
為什么會有這樣的結果呢?我們來看看++i和i++的字節碼有什么不一樣
代碼如下:
public class MyDemo { public static void main(String[] args) { beforeAdd(1); afterAdd(1); } public static void beforeAdd(int arg){ int before = ++arg; } public static void afterAdd(int arg){ int after = arg++; } }
查看字節碼指令:javap -v 路徑\MyDemo.class,得到如下字節碼指令

從上圖分析:++i是先把自增再壓棧,而i++是先壓棧再自增,很明顯解釋上面例子的結果
思考一個問題fori循環i++和++i的效率有差別嗎?
把上面的代碼稍微修改:
public class MyDemo { public static void main(String[] args) { beforeAdd(1); afterAdd(1); } public static void beforeAdd(int arg){ for (int i = 0; i < arg; ++i) { } } public static void afterAdd(int arg){ for (int i = 0; i < arg; i++) { } } }
同樣查看字節碼指令:


它們的字節碼指令一樣,所以它們的執行效率也一樣。
