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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hkh3321313 中级黑马   /  2016-3-22 23:10  /  9703 人查看  /  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 个回复

正序浏览
Buer 来自手机 中级黑马 2016-7-15 12:38:21
111#
意思就是,i++是一个变量,为一个地址,指向了整数0,运算结束后变成了i指向0
回复 使用道具 举报
这不就是赋值语句和判断语句的却别吗,本题循环里就是个赋值语句
回复 使用道具 举报
那个,小弟看完之后真是受教了。不过,如果把 i = i ++; 换成 i ++; 的话,结果是101,不是100。而若换成 i = ++ i; 也是101,但好像有警告信息。
回复 使用道具 举报
那个,小弟看完之后真是受教了。不过,如果把 i = i ++; 换成 i ++; 的话,结果是101,不是100。而若换成 i = ++ i; 也是101,但好像有警告信息。
回复 使用道具 举报
长见识了,如果不是这种表达式就好类额
回复 使用道具 举报
涨知识        
回复 使用道具 举报
可以!!1
回复 使用道具 举报
给力啊,学习了
回复 使用道具 举报
好吧,开眼界了,又学到东西了
回复 使用道具 举报
涨姿势了!!
回复 使用道具 举报
学习一下下
回复 使用道具 举报
学习了,涨姿势
回复 使用道具 举报
这个是对的,先赋值后运算,i的值一直是0,
回复 使用道具 举报
longforus 来自手机 中级黑马 2016-7-13 22:45:54
98#
原来是这样的 学习了
回复 使用道具 举报
这个是特例 一定要记住
回复 使用道具 举报
我遇到过,自我测试那里有一道这样的题。
回复 使用道具 举报
i一直就是0啊 循环多少次都是
回复 使用道具 举报
编号89757 来自手机 中级黑马 2016-4-16 07:58:30
94#
还是不明白,这个涉及太底层的知识,没时间去专研
回复 使用道具 举报
确实没注意过,现在知道原理了,谢谢楼主分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马