您的位置:首页 > 编程语言 > Java开发

话题14--井然有序 运算顺序的详细挖掘

2015-11-28 20:23 295 查看
在Java中,java代码经过编译之后,生成的是与平台无关的字节码,并且交互对象为java虚拟机(jvm),与底层的硬件环境无关,所以,运算结果在java中是固定的。

1 . 一个原则

操作数从左向右的计算规则与运算符的结合性无关,就算运算符是从右向左的,也会在运算之前先确定左侧的操作数。

2 . 程序示例:

package huati14;

import java.util.Arrays;

/**
* @author Vayne
*
*/
public class Order {
public static void main(String[] args) {
int a[] = new int[] { 0, 0, 0, 0, 0 };
int i = 1;
a[++i] = i++;
System.out.println("i=" + i);
System.out.println(Arrays.toString(a));
int j = 3;
a[j] = j = 4;
System.out.println("j=" + j);
System.out.println(Arrays.toString(a));
int b[] = new int[] { 9, 9, 9, 9, 9 };
int k = 5;
int c[] = a;
a[--k] = (a = b)[k];
System.out.println("k=" + k);
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
System.out.println(Arrays.toString(c));
}

}
程序运算结果:
i=3
[0, 0, 2, 0, 0]
j=4
[0, 0, 2, 4, 0]
k=4
[9, 9, 9, 9, 9]
[9, 9, 9, 9, 9]
[0, 0, 2, 4, 9]
程序分析:
1) a[++i]=i++。原来的i是1,先确认左侧 操作数,++i等于2,因此左侧是a[2],然后开始进行赋值运算,左侧为2,因此该式等价于a[2]=2。
2) a[j]=j=4。仍然是先确定左侧操作数,j为3,即左侧操作数为a[3],然后进行赋值运算,所以该式等价于a[3]=j=4,最后a[3]和j都是4。
3)   a[--k]=(a=b)[k] 。这个应该是最难理解的一个式子。我们首先要清楚数组名代表的是一串连续地址区间的首地址,数组名只是代号而已。因此,我们还是要先确定操作数,因为K原来是5,则左侧操作数是a[4],但是我们这里要搞清楚的是,这个a[4]是在a这个代号没改变之前的代表的地址的第五个地址。即使在以后的操作中,a这个代号不代表这个地址了,左侧的操作数还是a没改变之前的地址。比如现在我们说故宫在北京,即使以后“北京”这个代号不在中国使用了,转而给了美国用,但是故宫还是在中国的那个固定的地理位置上,故宫这个建筑并没有跟着北京这个代号飞到美国去。回到正题,左侧我们确定其操作数是一个固定的地址a[4],因为有a=b这个操作,因此a现在指向的不是原来的a了,而是指向了b,所以最后a和b的输出结果相同。而因为之前我们指定c指在原来a的位置上,而在赋值操作前,我们执行了a[4]=b[4],因此c会在原来的a的基础上变化。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java