A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hkh3321313 中级黑马   /  2016-3-22 23:10  /  9659 人查看  /  115 人回复  /   7 人收藏 转载请遵从CC协议 禁止商业使用本文

今天上课的时候提到一个很有意思的现象,老师的讲解不是很明白,现在和大家分享一下网上的理解.class Demo {
public static void main(String [] args){
int i=0;

for(int j=0;j<=100;j++){

    i=i++;
  }
System.out.println("i="+i);

}
}
一开始我也以为最终结果为i=100,实际的结果是i=0.为什么会出现这样的结果呢?
原来是在编译器上出了问题,java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:

i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。
明白了上面的问题,让我们接下来看看i=i++的情况:



所以这样最后一次循环内的结果仍旧是i(即0)。

而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了.


评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1 很给力!

查看全部评分

115 个回复

倒序浏览
学习了,涨姿势,
回复 使用道具 举报
长知识了
回复 使用道具 举报
这个问题一开始我和同学也纠结好久,不过后来明白了,不过楼主分享的很详细,理解又加深了.
回复 使用道具 举报
够牛逼的!
回复 使用道具 举报
自我测试那里有一道这样的题。。。我错了
回复 使用道具 举报
Ak-47 中级黑马 2016-3-23 01:45:12
7#
刚学基础但还是看的不是很懂啊
回复 使用道具 举报
不行了,还是没有理解过来 ,,内存上的i+1,是怎么回事,怎么是i赋值给i+1的呢,
回复 使用道具 举报
Banana_uSuOO 来自手机 中级黑马 2016-3-23 08:21:15
9#
还没太懂!来自: iPhone客户端
回复 使用道具 举报
i++和++i傻傻分不清
回复 使用道具 举报
不错,受教了
回复 使用道具 举报
还是不太懂
回复 使用道具 举报
厉害,学习学习~
回复 使用道具 举报
本帖最后由 695010894 于 2016-3-23 14:01 编辑

你这个 i=i++;是先 赋值再自增(自增后并不存在赋值操作),如果写成  i=++i;或者直接i++;而且0-100结果是101。
回复 使用道具 举报
很厉害 赞一个!!!
回复 使用道具 举报
学习了,谢谢
回复 使用道具 举报
之前看过类似的问题,时间久了就忘了,这次收藏起来,get!
回复 使用道具 举报
这种陷阱好容易坑人啊!
回复 使用道具 举报
真的吗?我试试
回复 使用道具 举报
我也以为是100,长见识了,这个题目分享的好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马