Java学习——运算顺序的详细挖掘
来源:互联网 发布:学编程有什么好书 编辑:程序博客网 时间:2024/06/08 15:31
在 Java 运算中,存在一些关系到顺序的计算,这些计算顺序在 C / C++语言中是不确定的,并且最后的结果值也没有保证。不过, Java 经过编译之后,生成的是与平台无关的字节码,并且交互对象为 Java 虚拟机,与底层的硬件环境无关。因此,这些运算结果在 Java 中是确定的。
从左向右的计算顺序
与 C / C++不同的是,在 Java 中,表达式的计算与结果是确定的。不受硬件环境的影响。例如,一个在 C / C++中比较常见例子:
int i = 5; int j = (i++) + (i++) + (i++);
在 C / C++中,变量 i 与 j 的值是不确定的,根据不同的开发环境,结果也不相同。例如,在 Turbo C 中, i 的值为 8, j 的值为 15,而在 VC 中, i 的值为 8, j 的值为 18。在 Java中, i和 j 的值是确定的, i 为 8, j 为 18。
在 Java 中,操作数的计算顺序是从左向右的也就是首先会计算左侧的操作数,然后再计算其右侧的操作数。例如:
int a = 3; int b = a + (++a) + (a = 1) + a;
执行这两个语句之后, a 的值为 1, b 的值为 9。因为 Java 就是从左向右进行计算的,故最后(即最右侧)一条修改 a 值的表达式为:
a = 1
而第 2 条语句也就是:
int b = 3 + 4 + 1 + 1;
操作数从左向右的计算规则与运算符的结合性无关,就算运算符是由右向左结合的,也会在运算之前先确定左侧的操作数,请看下面的程序。
【例】 操作数的确定。
1. package chapter2;2.3. import java.util.Arrays;4.5. public class Order {6. public static void main(String[] args) {7. int a[] = new int[] {8. 0, 0, 0, 0, 0, 09. };10. int i = 1;11. a[++i] = i++;12. System.out.println("i=" + i);13. System.out.println(Arrays.toString(a));14. int j = 3;15. a[j] = j = 4;16. System.out.println("j=" + j);17. System.out.println(Arrays.toString(a));18. int b[] = new int[] {19. 9, 9, 9, 9, 9, 920. };21. int k = 5;22. int c[] = a;23. a[--k] = (a = b)[k];24. System.out.println("k=" + k);25. System.out.println(Arrays.toString(a));26. System.out.println(Arrays.toString(b));27. System.out.println(Arrays.toString(c));28. }29.}
程序运行结果如下:
i=3[0, 0, 2, 0, 0, 0]j=4[0, 0, 2, 4, 0, 0]k=4[9, 9, 9, 9, 9, 9][9, 9, 9, 9, 9, 9][0, 0, 2, 4, 9, 0]
你预测正确了吗?对于程序第 11 行:
a[++i] = i++;
虽然赋值运算符是从右向左结合的,但是操作数的确定是从左向右的,也就是在赋值操作发生前,首先会确定左侧的操作数, i 的值为 1, ++i 的值就是 2,因此,左侧的操作数是 a[2],因此,这条语句就相当于:
a[2] = 2;
然后 i 的值再加 1,值为 3。
第 15 行的赋值语句:
a[j] = j = 4;
也是同样的道理,首先确定左侧操作数, j 的值为 3,也就是 a[3],这相当于:
a[3] = j = 4;
赋值之后, j 和 a[3]的值都是 4。
同样,第 23 行的语句:
a[--k] = (a = b)[k];
k 的值是 5,这就相当于:
--k;int[] temp = a;a = b;temp[4] = b[4];
然后,原数组 a[4](也就是后来的 c[4])的值改变。
(未完待续)
本文出自柠檬派http://www.lemonpai.com 请务必保留此出处 ,否则将追究法律责任!
- Java学习——运算顺序的详细挖掘
- Java学习——运算顺序的详细挖掘(下)
- 透析Java本质-运算顺序的详细挖掘
- Java_语法基础_运算顺序的详细挖掘
- 话题14--井然有序 运算顺序的详细挖掘
- 学习数据挖掘的顺序
- 数据挖掘学习顺序
- 数据挖掘学习篇——数据挖掘的概念
- 学习java的顺序?
- java的学习顺序
- 学习java的顺序
- Java关于继承的详细初始化顺序
- 学习Java的学习顺序
- java 运算符顺序
- 数据结构实践——顺序表的基本运算
- 第三周——顺序表的基本运算
- 数据结构实践——顺序表的基本运算2
- 第三周——顺序表的基本运算
- ZZULI 1867: 礼上往来【错排】
- tvs管的工作原理
- 线程同步
- 获取最新可用hosts文件
- Java面试更新
- Java学习——运算顺序的详细挖掘
- ZOj 3929Deque and Balls
- 《虚幻4引擎快速入门视频教程》FAQ
- sublime实用快捷键 mac版
- SurfaceView
- Android基础知识回顾之Activity
- 操作系统设计与实现 第一章 引言(二)
- ACM刷题之HDU————GPA
- Android的5个进程等级