[原创]j=j++问题_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3040 | 回复: 0   主题: [原创]j=j++问题        下一篇 
lusxingbao
注册用户
等级:少校
经验:1487
发帖:100
精华:0
注册:2012-11-12
状态:离线
发送短消息息给lusxingbao 加好友    发送短消息息给lusxingbao 发消息
发表于: IP:您无权察看 2012-11-14 11:04:24 | [全部帖] [楼主帖] 楼主

今天在群里看到这样一条信息,信息如下,问输出j的值是多少?

int j=0;
for(int i=0;i<100;i++){
      j=j++;
}
System.out.println(j);


我的第一感觉是98,结果拿去运行,运行结果居然是0.让我很难理解,于是百度求解。
以下是找到的最好解释:

下面是用javap -c 来反编译成汇编,查操作过程。
i++反编译结果:

public static void main();
Code:
0:   iconst_0
1:   istore_0
2:   iload_0
3:   iinc    0, 1
6:   istore_0
7:   return
}


++i反编译结果:

public static void main();
Code:
0:   iconst_0
1:   istore_0
2:   iinc    0, 1
5:   iload_0
6:   istore_0
7:   return
}


解释:
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_0是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_0是将变量区中的值暂存如堆栈

中。
因为i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的

istore_0又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。
又因为i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了

istore_0,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1。

看了以上解释后自己还是有点晕,希望看懂或知道的朋友给予详细解释。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论