java基礎(四) java運算順序的深入解析

程式設計師歐陽思海發表於2018-04-09

1. 從左往右的計算順序

與C/C++不同的是,在Java中,表示式的計算與結果是確定的,不受硬體與環境的影響如:

int i = 5;
int j = (i++) + (i++) +(i++);
複製程式碼

在C/C++中,這個例子的運算結果將會根據不同的開發環境而不同。Turbo C下,j的值是15;在VC下,j的值是 18。

在Java中,表示式的計算順序是從左往右的,也就是先計算左側的結果,再計算右側的結果。上面的例子計算結果就一定是 18。也就是說,右側(i++)表示式使用的 i 的值 就是 左側(i++)表示式計算完後 i 的值,即左側比右側先進行運算。

看下面幾個例子

@ 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));
複製程式碼

執行結果:

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));
複製程式碼

執行結果:

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]

2. 複合運算子的計算順序

複合運算子有一個特點:可以自動將右側的運算結果型別轉換成左側運算元的型別。如:

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,獲取優質資源。

相關文章