接着上一篇没发完的Java篇——运算顺序的详细挖掘(上)继续:
复合运算符
我们知道,复合运算符可以自动将右侧运算的结果类型转换为左侧操作数的类型。例如如下的代码:
- byte b = 1;
- b = b + 1; //错误
- b += 1; //正确
因为常量 1 为 int 类型,所以右侧的结果是 int 类型,不能赋值给一个 byte 类型的变量,但
是使用复合运算符( +=)是可以的,第 3 条语句相当于:
- b = (byte)(b + 1);
除此之外,复合运算符也有上述的性质,即遵循操作数从左向右计算的原则,也就是说,在执行赋值操作之前,首先会确定左侧的操作数。
【例】 复合运算符。
- 1. package chapter2;
- 2.
- 3. import java.util.Arrays;
- 4.
- 5. public class Order2 {
- 6. public static void main(String[] args) {
- 7. int a = 10;
- 8. a += ++a;
- 9. System.out.println("a=" + a);
- 10. int[] array = new int[] {
- 11. 8, 9, 10
- 12. };
- 13. int b = 1;
- 14. array[b] *= b = 2;
- 15. System.out.println("b=" + b);
- 16. System.out.println(Arrays.toString(array));
- 17. }
- 18.}
由于有了上面的讲解,这个程序的运行结果应该不难想象了,如下:
- a=21
- b=2
- [8, 18, 10]
总之,运算前会先将左侧的操作数保存起来,左侧的操作数不会受到其右侧表达式的影响而造成改变。
总结:
1.在 Java 语言中,操作数的计算顺序是从左向右的,即使运算符是从右向左结合的也是
如此。
2.与 C / C++等语言不同, Java 的运算结果受硬件环境的影响很小,计算方式也是确定的。
举一反三
在参数传递的过程中,是否也符合本话题讲述的规则呢?例如下面的程序:
- 1.package chapter2;
- 2.
- 3. public class Order3 {
- 4. public static void main(String[] args) {
- 5. Order3 order = new Order3();
- 6. int i = 10;
- 7. order.test(i, ++i, i = 2);
- 8. order.test(i = 5, i++, i);
- 9. }
- 10.
- 11. public void test(int x, int y, int z) {
- 12. System.out.println(x);
- 13. System.out.println(y);
- 14. System.out.println(z);
- 15. }
- 16.}[color=black][backcolor=rgb(255, 255, 255)][font=CourierNewPSMT, serif][size=9pt] [/size][/font][/backcolor][/color]
结果是多少呢?自己试试看吧。
本文作者:梁勇 出自柠檬派http://www.lemonpai.com 请务必保留此出处 ,否则将追究法律责任!


雷达卡



京公网安备 11010802022788号







