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

本文根据 Java 语言规范第7版,详细解析了 i=i++ 表达式的运行机制。通过分析规范中的简单赋值操作符和后缀递增操作符,得出 i 的最终值为 0。讨论了在编程实践中需要注意的细节,帮助理解 Java 中的这种复合表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 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.youkuaiyun.com/topics/390396394?page=1#post-393973973)

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值