免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Java i = i++;
最近访问板块 发新帖
楼主: bysea51
打印 上一主题 下一主题

i = i++; [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-10-24 20:29 |只看该作者

i = i++;

从上边来看只有iload_1和iinc 1,1是颠倒的.我怎么没体会到为什么i++的时候会输出0.如果istore_1代表存储i,那么不管上边的什么顺序,最后不都是i加一并且被存储了吗.紧接着下边用一个iload_1来去i的值.但是为什么不出现预期的结果呢?

论坛徽章:
0
12 [报告]
发表于 2004-10-24 20:35 |只看该作者

i = i++;

除非一种情况,JVM会因为某种原因来调整指令的执行顺序

论坛徽章:
0
13 [报告]
发表于 2004-10-25 12:57 |只看该作者

i = i++;

最后不都是i加一并且被存储了吗.

问题是存在那里?

论坛徽章:
0
14 [报告]
发表于 2004-10-25 14:14 |只看该作者

i = i++;

在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。
又因为i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1。

论坛徽章:
0
15 [报告]
发表于 2004-10-25 16:21 |只看该作者

i = i++;

楼上说得好清楚,
不知道从哪里可以看到这样的知识?

论坛徽章:
0
16 [报告]
发表于 2004-10-25 20:37 |只看该作者

i = i++;

原帖由 "bysea51" 发表:
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为i = i++;是..........

描述的挺有道理,但不明白,为什么要直接对变量区的进行++而不对临时的堆栈先加然后在存储到变量区呢?

论坛徽章:
0
17 [报告]
发表于 2004-10-25 20:45 |只看该作者

i = i++;

bysea51说的应该是正确的,单执行情况i++的时候只有一个iinc 1,1.
应该是改变bysea51所说的变量区的东西.顺便问一问bysea51,iinc 1,1.
指令在JVM规范里应该有的吧,我没有看过,有空看看.哈哈.

论坛徽章:
0
18 [报告]
发表于 2004-10-25 20:47 |只看该作者

i = i++;

果然是JVM的Instruction

论坛徽章:
0
19 [报告]
发表于 2004-10-25 21:21 |只看该作者

i = i++;

原帖由 "白色乌鸦" 发表:
楼上说得好清楚,
不知道从哪里可以看到这样的知识?
Java VM Specification

论坛徽章:
0
20 [报告]
发表于 2004-10-25 21:25 |只看该作者

i = i++;

原帖由 "镖师甲" 发表:

描述的挺有道理,但不明白,为什么要直接对变量区的进行++而不对临时的堆栈先加然后在存储到变量区呢?
这个要看表达式的值的定义了。因为按照JVM Spec,任何一个算术操作都是把最终的表达式的计算结果放到Operand Stack里。
所以在定义了“i++这个操作的表达式的值为i,而不是i+1”之后,i++的计算过程中,Operand Stack实际上并不用变化。所以无论是从Operand Stack里进行inc还是直接对变量区进行inc,结果都是一样的:Operand Stack没变,变量区加一。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP