从左向右的计算顺序:
例:
package deep;
import java.util.Arrays;
public class Sequence {
public static void main(String[] args) {
int a[] = new int[] { 0, 0, 0, 0, 0 };
int j = 3;
a[j] = j = 4;
System.out.println("j=" + j);
System.out.println(Arrays.toString(a));
}
}
运行结果:
j=4
[0, 0, 0, 4, 0]
首先确定左侧操作数,j的值为3,也就是a[3],这相当于:
a[3]=j=4;
复合运算符:
我们知道,符合运算符可以自动将右侧运算的结果类型转换为左侧操作数的类型。例如如下的代码:
byte b=1;
b=b+1;//错误
b+=1;//正确
因为常量1为int类型,所以右侧的结果是int类型,不能赋值给一个byte类型的变量,但是使用复合运算符(+=)是可以的,第3条语句相当于:
b=(byte)(b+1);
除此之外,复合运算符也有上述的性质,即遵循操作数从左向右计算的原则,也就是说,在执行赋值操作之前,首先会确定左侧的操作数。
例:
package deep;
import java.util.Arrays;
public class Order {
public static void main(String[] args) {
int a = 10;
a += ++a;
System.out.println("a=" + a);
int[] array = new int[] { 8, 9, 10 };
int b = 1;
array[b] *= b = 2;
System.out.println("b=" + b);
System.out.println(Arrays.toString(array));
}
}
运行结果:
a=21
b=2
[8, 18, 10]
总之,运算前会将左侧的操作数保存起来,左侧的操作数不会受到其右侧表达式的影响而造成改变。