话题14--井然有序 运算顺序的详细挖掘
2015-11-28 20:23
295 查看
在Java中,java代码经过编译之后,生成的是与平台无关的字节码,并且交互对象为java虚拟机(jvm),与底层的硬件环境无关,所以,运算结果在java中是固定的。
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的基础上变化。
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统