Java 语言中 关于 i=i++ 表达式的规范解释

来源:互联网 发布:网络安全法答案单选题 编辑:程序博客网 时间:2024/05/18 16:35

在 Java 论坛,看到多次,有人提问关于 i=i++ 表达式的解释。(例如,见讨论贴参照连接[4])

把自己在论坛的回复整理了一下。网上有用反编译给出的解释(见讨论贴参照连接[5]),这里根据 Java 语言规范的相关规定,给出解释。


问题

具体问题的简化版如下:

代码是:

1
2
3
int i=0;
i = i++;
System.out.println(i);


问题是:表示的结果 i 的值是什么?


Java 语言规范的相关规定

首先根据 Java Language Specification (Java 语言规范,见参照连接[1])的定义, 


表达式 A=B 的执行步骤,(规范15.26.1节,见参照连接[2])简单地说,就是:
1. 对等号左边的表达式 A 进行计算,算出最终的结果,必须是参照或变量;
2. 对等号右边的表达式 B 进行计算,得到返回值;
3. 把第2步得到的右边的返回值,赋予第一步中得到的左边的参照或变量。


表达式 A++ 的执行步骤是,(规范15.14.2节,见参照连接[3]) 简单地说,就是:
1. 对 A 进行计算,算出最终的结果,必须是参照或变量;
2. 第一步中得到的参照或变量的值 加一;
3. 整个表达式的返回值是 第二步加一之前,第一步中得到的参照或变量的值。


分析和解释

下面,根据上面列出的Java 语言规范的相关规则,解析一下。


1
2
int i=0;
i = i++;


第二行,i = i++ 的执行步骤如下:

1. 计算等号左边,不用算,结果就是就是变量i;
2. 对等号右边的表达式 i++ 进行计算;
  2.1. i 是变量,本身不用算; 
  2.2. i++ 的计算时,i 的值被加一; 
  2.3. 整个 i++ 表达式的计算结果的 返回值是,i被加一之前的值0
3. 把第一步中算出的右边的结果 0, 赋予左边的变量 i.


结果 i 的值是 0 .


注:因为技术上读的多为英文文献,所以许多 IT 词汇的中文译法不太清楚。尽力而为。如有错误,请多多包涵,当以英文原文为准。


参考连接

[1]  The Java Language Specification, 7 Edition. ( Java 语言规范, 版本7,http://docs.oracle.com/javase/specs/jls/se7/html/index.html)

[2]  规范15.26.1. Simple Assignment Operator = (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.1)

[3]  规范 15.14.2. Postfix Increment Operator ++  (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.14.2)

[4]  Java论坛讨论贴: Java i++与++i困惑 (http://bbs.csdn.net/topics/390396394?page=1#post-393973973)

[5] 博客文章:java中i=i++问题分析( http://www.ticmy.com/?p=43)