- 論壇徽章:
- 0
|
在 Java 運(yùn)算中,存在一些關(guān)系到順序的計(jì)算,這些計(jì)算順序在 C / C++語言中是不確定的,并且最后的結(jié)果值也沒有保證。不過, Java 經(jīng)過編譯之后,生成的是與平臺無關(guān)的字節(jié)碼,并且交互對象為 Java 虛擬機(jī),與底層的硬件環(huán)境無關(guān)。因此,這些運(yùn)算結(jié)果在 Java 中是確定的。
從左向右的計(jì)算順序
與 C / C++不同的是,在 Java 中,表達(dá)式的計(jì)算與結(jié)果是確定的。不受硬件環(huán)境的影響。例如,一個(gè)在 C / C++中比較常見例子:- int i = 5;
- int j = (i++) + (i++) + (i++);
復(fù)制代碼 在 C / C++中,變量 i 與 j 的值是不確定的,根據(jù)不同的開發(fā)環(huán)境,結(jié)果也不相同。例如,在 Turbo C 中, i 的值為 8, j 的值為 15,而在 VC 中, i 的值為 8, j 的值為 18。在 Java中, i和 j 的值是確定的, i 為 8, j 為 18。
在 Java 中,操作數(shù)的計(jì)算順序是從左向右的也就是首先會計(jì)算左側(cè)的操作數(shù),然后再計(jì)算其右側(cè)的操作數(shù)。例如:- int a = 3;
- int b = a + (++a) + (a = 1) + a;
復(fù)制代碼 執(zhí)行這兩個(gè)語句之后, a 的值為 1, b 的值為 9。因?yàn)?Java 就是從左向右進(jìn)行計(jì)算的,故最后(即最右側(cè))一條修改 a 值的表達(dá)式為:而第 2 條語句也就是:操作數(shù)從左向右的計(jì)算規(guī)則與運(yùn)算符的結(jié)合性無關(guān),就算運(yùn)算符是由右向左結(jié)合的,也會在運(yùn)算之前先確定左側(cè)的操作數(shù),請看下面的程序。
【例】 操作數(shù)的確定。- 1.package chapter2;
- 2.
- 3. import java.util.Arrays;
- 4.
- 5. public class Order {
- 6. public static void main(String[] args) {
- 7. int a[] = new int[] {
- 8. 0, 0, 0, 0, 0, 0
- 9. };
- 10. int i = 1;
- 11. a[++i] = i++;
- 12. System.out.println("i=" + i);
- 13. System.out.println(Arrays.toString(a));
- 14. int j = 3;
- 15. a[j] = j = 4;
- 16. System.out.println("j=" + j);
- 17. System.out.println(Arrays.toString(a));
- 18. int b[] = new int[] {
- 19. 9, 9, 9, 9, 9, 9
- 20. };
- 21. int k = 5;
- 22. int c[] = a;
- 23. a[--k] = (a = b)[k];
- 24. System.out.println("k=" + k);
- 25. System.out.println(Arrays.toString(a));
- 26. System.out.println(Arrays.toString(b));
- 27. System.out.println(Arrays.toString(c));
- 28. }
- 29.}
復(fù)制代碼 程序運(yùn)行結(jié)果如下:- i=3
- [0, 0, 2, 0, 0, 0]
- j=4
- [0, 0, 2, 4, 0, 0]
- k=4
- [9, 9, 9, 9, 9, 9]
- [9, 9, 9, 9, 9, 9]
- [0, 0, 2, 4, 9, 0]
復(fù)制代碼 你預(yù)測正確了嗎?對于程序第 11 行:雖然賦值運(yùn)算符是從右向左結(jié)合的,但是操作數(shù)的確定是從左向右的,也就是在賦值操作發(fā)生前,首先會確定左側(cè)的操作數(shù), i 的值為 1, ++i 的值就是 2,因此,左側(cè)的操作數(shù)是 a[2],因此,這條語句就相當(dāng)于:然后 i 的值再加 1,值為 3。
第 15 行的賦值語句:也是同樣的道理,首先確定左側(cè)操作數(shù), j 的值為 3,也就是 a[3],這相當(dāng)于:賦值之后, j 和 a[3]的值都是 4。
同樣,第 23 行的語句:k 的值是 5,這就相當(dāng)于:- --k;
- int[] temp = a;
- a = b;
- temp[4] = b[4];
復(fù)制代碼 然后,原數(shù)組 a[4](也就是后來的 c[4])的值改變。 |
|