1. 從左往右的計(jì)算順序**與C/C 不同的是,在Java中,表達(dá)式的計(jì)算與結(jié)果是確定的,不受硬件與環(huán)境的影響。**如: int i = 5;
int j = (i ) (i ) (i );
在C/C 中,這個(gè)例子的運(yùn)算結(jié)果將會(huì)根據(jù)不同的開發(fā)環(huán)境而不同。Turbo C下,j的值是15;在VC下,j的值是 18。 在Java中,表達(dá)式的計(jì)算順序是從左往右的,也就是先計(jì)算左側(cè)的結(jié)果,再計(jì)算右側(cè)的結(jié)果。上面的例子計(jì)算結(jié)果就一定是 18。也就是說(shuō),右側(cè)(i ) 表達(dá)式使用的 i 的值 就是 左側(cè)(i ) 表達(dá)式計(jì)算完后 i 的值,即左側(cè)比右側(cè)先進(jìn)行運(yùn)算。 看下面幾個(gè)例子 @ 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));
運(yùn)行結(jié)果: i=3 [0, 2, 0, 0]
@ Example 2 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));
運(yùn)行結(jié)果: 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("數(shù)組a[]: " Arrays.toString(a));
System.out.println("數(shù)組c[]: " Arrays.toString(cc));
運(yùn)行結(jié)果: i=2 數(shù)組a[]: [1, 2, 3, 4, 5] 數(shù)組c[]: [0, 0, 3, 0]
2. 復(fù)合運(yùn)算符的計(jì)算順序復(fù)合運(yùn)算符有一個(gè)特點(diǎn):可以自動(dòng)將右側(cè)的運(yùn)算結(jié)果類型轉(zhuǎn)換成左側(cè)操作數(shù)的類型。如: byte b = 1; //正確
b = b 1; //錯(cuò)誤,1是整形int,所以右側(cè)的b 1的結(jié)果是int類型。需強(qiáng)制轉(zhuǎn)換
所以,復(fù)合類型的表達(dá)式,如 b = 1 ; 是相當(dāng)于: byte b = (int)(b 1);
除此之外, 復(fù)合運(yùn)算符也是遵守操作數(shù)從右往左計(jì)算的原則。 也就是說(shuō),在執(zhí)行賦值操作之前,首先會(huì)確定左側(cè)的操作數(shù)。 看下面的幾個(gè)例子: int a = 1;
a = a;
System.out.println(a);
運(yùn)行結(jié)果: 3
根據(jù)上面的所說(shuō)的,這個(gè)程序就不難理解了,先計(jì)算左側(cè)a的值是1,然后再計(jì)算出右側(cè) a 表達(dá)式的值是 2 ,最后便是計(jì)算 1 2 的值為 3,賦值給a。 如果還是覺(jué)得難理解的,可以寫成等價(jià)的普通式子,然后從左往右計(jì)算右側(cè)的表達(dá)式。這可能比較容易理解: a = a a;
再看一個(gè)例子,加深理解: int a = 5;
a *= a=2;
System.out.println(a);
運(yùn)行結(jié)果: 10 作者:jinggod
|