分享

java基础篇(5) 运算顺序的深入解析

 印度阿三17 2019-05-02

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

作者:jinggod

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多