Java 语言中 关于 i=i++ 表达式的规范解释
在 Java 论坛,看到多次,有人提问关于 i=i++ 表达式的解释。(例如,见讨论贴参照连接[4])
把自己在论坛的回复整理了一下。网上有用反编译给出的解释(见讨论贴参照连接[5]),这里根据 Java 语言规范的相关规定,给出解释。
问题
123具体问题的简化版如下:
代码是:
int
i=
0
;
i = i++;
System.out.println(i);
问题是:表示的结果 i 的值是什么?
Java 语言规范的相关规定
首先根据 Java Language Specification (Java 语言规范,见参照连接[1])的定义,
1. 对等号左边的表达式 A 进行计算,算出最终的结果,必须是参照或变量;
2. 对等号右边的表达式 B 进行计算,得到返回值;
3. 把第2步得到的右边的返回值,赋予第一步中得到的左边的参照或变量。
1. 对 A 进行计算,算出最终的结果,必须是参照或变量;
2. 第一步中得到的参照或变量的值 加一;
3. 整个表达式的返回值是 第二步加一之前,第一步中得到的参照或变量的值。
分析和解释
下面,根据上面列出的Java 语言规范的相关规则,解析一下。
int
i=
0
;
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)