文档章节

Java篇——运算顺序的详细挖掘

ws小马哥
 ws小马哥
发布于 2016/04/11 13:51
字数 960
阅读 15
收藏 0

     在 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, 0
9. };
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, 9
20. };
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   请务必保留此出处 ,否则将追究法律责任!


© 著作权归作者所有

ws小马哥
粉丝 0
博文 2
码字总数 1523
作品 0
朝阳
私信 提问
Java虚拟机基础——1Java的内存模型

最近和几个之前一起做安卓的朋友喝酒,他最近在研究JVM,我们就简单的讨论了起来,他比我研究的深很多,我也不甘堕落,自己也开始研究了一下,写了4篇文章整理了一下自己的思路,Java虚拟机整...

隔壁老李头
2018/10/03
0
0
Java 8 将支持无符号整型

OpenJDK的领导者Joe Darcy在其Oracle博客上提交了一篇文章——Unsigned Integer Arithmetic API now in JDK 8,表示在Java 8中将提供对无符号整型的支持。详细的介绍请访问:http://blogs.or...

虫虫
2012/01/30
4.7K
14
【死磕Java并发】—– 死磕 Java 并发精品合集

【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。 先来一个总览图: 【高清图,请关注“Java技术驿站”公众号,回复:脑...

chenssy
2018/07/22
0
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
安卓中高级开发工程师面试之——面试永远逃不掉的Java线程面试题

不管你是Java工程师还是安卓开发工程师,只要你是计算机开发工程师,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大...

小饼干的梦
2018/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部