java基础(四) java运算顺序的深刻解析

1. 从左往右的计算顺序

与C/C++不一样的是,在Java中,表达式的计算与结果是肯定的,不受硬件与环境的影响如:html

int i = 5;
int j = (i++) + (i++) +(i++);
复制代码

在C/C++中,这个例子的运算结果将会根据不一样的开发环境而不一样。Turbo C下,j的值是15;在VC下,j的值是 18。java

在Java中,表达式的计算顺序是从左往右的,也就是先计算左侧的结果,再计算右侧的结果。上面的例子计算结果就必定是 18。也就是说,右侧(i++)表达式使用的 i 的值 就是 左侧(i++)表达式计算完后 i 的值,即左侧比右侧先进行运算。数组

看下面几个例子bash

@ 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));
复制代码

运行结果:spa

i=3 [0, 2, 0, 0]code

@ Example 2htm

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));
复制代码

运行结果:blog

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,获取优质资源。

相关文章
相关标签/搜索