我們用一個簡單的例子分析下邊的運行結果:
1 package demo; 2 3 public class ZiZeng { 4 public static void main(String[] args) { 5 int i = 0; 6 test(i); 7 // i = i++; 8 i = ++i; 9 System.out.println("----" + i); 10 // i = i++; 11 i = i++; 12 System.out.println("****" + i); 13 14 } 15 16 public static void test(int i){ 17 i++; 18 System.out.println("++++" + i); 19 } 20 }
輸出結果:
++++1 ----1 ****1
對以上的執行結果分析如下:
逐行代碼分析:
1, 在第5行定義了 int i = 0;
2, 在 第6行調用了test(i)方法,此時的 i = 0作為實際參數將值0傳給了test方法的形式參數i,
test方法中的i 是形式參數,形式參數值的改變不會影響實際參數,所以test方法中的i的值是1,而,main方法中i的值仍然為0
3, 第18行輸出 1
4, 在第8行中, i = ++i,先自增后賦值,所以此時 i = 1
5, 第9行輸出 i = 1;
6, 在第11行中,i = i++,先賦值再自增,,所以此時i = 1
7, 第12行輸出 1
練習題2:
對於以下,有int x = 5, y = 6, z;
題目1:z = ++x + y++;
題目2:z = ++x + x++;
題目3:x = ++x + x++;
題目4:z = x > y ? ++x : y++;
答案:
題目1:x = 6; z = 12; y = 7
題目2:x=7, y = 6, z=12
題目3:x=12
題目4:x = 5, y = 7, z = 6
練習3,
int a=1;
System.out.println(++a+a);
int i = 0;
int j = i++;
int k = --i;
這段代碼運行后,i等於多少?j等於多少?k等於多少?
i:0
j:0
k:0
1. int i = 0;
2. int j = i++ + ++i;
3. int k = --i + i--;
代碼執行后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=-2、k=-2。
練習5,
int a=5;
int b=++a; // ++在前 先運算再賦值 現在 a=b=6;
int c=--b+a; //--優先級比+高,先計算-- c此時b=5再加上a 5+6=11;再賦值
int c=a+(++b); //同理 括號優先級最高 先計算++b 此時b=7 6+7=13;再賦值
