與C/C++不一樣的是,在Java中,表達式的計算與結果是肯定的,不受硬件與環境的影響如:html
int i = 5;
int j = (i++) + (i++) +(i++);
複製代碼
在C/C++中,這個例子的運算結果將會根據不一樣的開發環境而不一樣。Turbo C下,j的值是15;在VC下,j的值是 18。java
在Java中,表達式的計算順序是從左往右的,也就是先計算左側的結果,再計算右側的結果。上面的例子計算結果就必定是 18。也就是說,右側(i++)
表達式使用的 i 的值 就是 左側(i++)
表達式計算完後 i 的值,即左側比右側先進行運算。數組
看下面幾個例子bash
@ Example 1微信
int a[] = new int[]{0,0,0,0};
int i = 1;
a[i++] = i++;
System.out.println("i="+i);
System.out.println(Arrays.toString(a));
複製代碼
運行結果:spa
i=3 [0, 2, 0, 0]code
@ Example 2htm
int a[] = new int[]{0,0,0,0};
int i = 1;
a[i++] = i = 4;
System.out.println("i="+i);
System.out.println(Arrays.toString(a));
複製代碼
運行結果:blog
i=4 [0, 4, 0, 0]資源
@ Example 3
int a[] = new int[]{0,0,0,0};
int b[] = new int[]{1,2,3,4,5};
int cc[] = a;
int i = 1;
a[++i] = (a=b)[i];
System.out.println("i="+i);
System.out.println("數組a[]: "+Arrays.toString(a));
System.out.println("數組c[]: "+Arrays.toString(cc));
複製代碼
運行結果:
i=2 數組a[]: [1, 2, 3, 4, 5] 數組c[]: [0, 0, 3, 0]
複合運算符有一個特色:能夠自動將右側的運算結果類型轉換成左側操做數的類型。如:
byte b += 1; //正確
b = b+1; //錯誤,1是整形int,因此右側的b+1的結果是int類型。需強制轉換
複製代碼
因此,複合類型的表達式,如 b += 1
; 是至關於:
byte b = (int)(b + 1);
複製代碼
除此以外, 複合運算符也是遵照操做數從右往左計算的原則。 也就是說,在執行賦值操做以前,首先會肯定左側的操做數。
看下面的幾個例子:
int a = 1;
a += ++a;
System.out.println(a);
複製代碼
運行結果:
3
根據上面的所說的,這個程序就不難理解了,先計算左側a的值是1,而後再計算出右側++a
表達式的值是 2 ,最後即是計算 1+2
的值爲 3,賦值給a。
若是仍是以爲難理解的,能夠寫成等價的普通式子,而後從左往右計算右側的表達式。這可能比較容易理解:
a = a + ++a;
複製代碼
再看一個例子,加深理解:
int a = 5;
a *= a=2;
System.out.println(a);
複製代碼
運行結果: 10
出處:http://www.cnblogs.com/jinggod/p/8424880.html
文章有不當之處,歡迎指正,你也能夠關注個人微信公衆號:
好好學java
,獲取優質資源。