黑马程序员技术交流社区

标题: 自增的问题! [打印本页]

作者: panningwjr    时间: 2013-8-14 12:03
标题: 自增的问题!
下面一段代码
  1. int count = 0;  
  2.         for (int i = 0; i < 10; i++) {  
  3.             count = count++;  
  4.         }  
  5.         System.out.println(count);  
复制代码
count的打印结果是0,不能理解,谁能帮忙解释下!
作者: yangxin540    时间: 2013-8-14 12:12
首先,咱们要明确count++是先把赋值,再进行自加,所以循环第一遍的时候下来count的值还是0,因为count初始化为0,把0赋给0当然还是零,虽然等号右边的count++,但是也没有改变count的值
  1. for (int i = 0; i < 10; i++) {  
  2.           count++;  //或者count = ++count;
  3.         }  
复制代码
这样count的值就改变了。
作者: 曹满林    时间: 2013-8-14 12:20
我想知道,这段代码是你全部代码吗?我觉得这块代码没问题,而且结果不应该是0,还有其他的代码吗?包括其它类中的,贴出来看看!
作者: 冒烟的芒果    时间: 2013-8-14 12:22
曹满林 发表于 2013-8-14 12:20
我想知道,这段代码是你全部代码吗?我觉得这块代码没问题,而且结果不应该是0,还有其他的代码吗?包括其 ...

这段代码有问题的,1楼正解
count = count++;是先赋值再加1;
++count是先加1再赋值
作者: 曹满林    时间: 2013-8-14 12:31
本帖最后由 曹满林 于 2013-8-14 12:34 编辑
冒烟的芒果 发表于 2013-8-14 12:22
这段代码有问题的,1楼正解
count = count++;是先赋值再加1;
++count是先加1再赋值 ...


难道他说的解决了你的问题?我知道他说的是正确的,但是这个解决了你的问题了?我有些不懂了,求解
作者: 曹满林    时间: 2013-8-14 12:35
曹满林 发表于 2013-8-14 12:31
难道他说的解决了你的问题?我知道他说的是正确的,但是这个解决了你的问题了?我有些不懂了,求解 ...

哦,原来你写的不是count++,而是count=count++;真是奇怪的写法,呵……
作者: EYE_SEE_YOU    时间: 2013-8-14 13:14
  1. int count = 0;  
  2.         for (int i = 0; i < 10; i++) {  
  3.             count = count++;       //哥哥,你不停地把0赋给count确实很好玩
  4.         }  
  5.         System.out.println(count);  
复制代码
但是你明明知道i++是什么意思,却写出个count=count++来又是什么意思
count把自己=0的初始值赋给了下一个count,然后自己再自增,但自增的结果没有赋出去,你不坑爹嘛
作者: panningwjr    时间: 2013-8-14 13:45
yangxin540 发表于 2013-8-14 12:12
首先,咱们要明确count++是先把赋值,再进行自加,所以循环第一遍的时候下来count的值还是0,因为count初始 ...

把0赋给0懂了,有个疑惑就是count++后count应该有一个时候是1,这个1跑哪去了?
作者: 单凯    时间: 2013-8-14 14:11
panningwjr 发表于 2013-8-14 13:45
把0赋给0懂了,有个疑惑就是count++后count应该有一个时候是1,这个1跑哪去了? ...

是内存机制的问题,后++是先进行取值操作,内存对0进行临时保存,然后对count加1,但是赋值操作还没有做呢,赋值操作的结果就是把内存中临时保存的0赋给了count,所以count最后的值变成了0,所以自增操作是有做的,只是被赋值操作覆盖掉了
作者: yangxin540    时间: 2013-8-14 14:51
panningwjr 发表于 2013-8-14 13:45
把0赋给0懂了,有个疑惑就是count++后count应该有一个时候是1,这个1跑哪去了? ...

因为是把0赋给了0,所以count的值根本就没有改变,下次循环还是0.我是这样理解的,把0赋给0后,参与循环的count值已经确定了。
作者: 杨增坤    时间: 2013-8-14 22:26
我感觉9楼说的有意思!有点明白!
作者: 杨增坤    时间: 2013-8-14 22:27
楼主您好,你的问题要是解决了,请把帖子更改为已解决,谢谢合作!
作者: 杨增坤    时间: 2013-8-14 22:28
我感觉9楼说的有点意思!
作者: 你懂得    时间: 2013-8-14 22:59
其实一直都是count把初始值0一次又一次的赋给左边的count,也就是0一直在赋给0,这个问题确实有趣。
作者: 刘劲松    时间: 2013-8-15 08:28
局部变量,局部有效呗,非要得其值,加个return返回值就行了哇。当然封装下,好些。
作者: 薛鹏鹏    时间: 2013-8-15 11:07
forward 发表于 2013-8-14 22:26
我感觉9楼说的有意思!有点明白!
  1. 我完整地用代码展示一遍吧。count++这个表达式可以这样来理解
  2. public static int Add(int count)
  3.     {
  4.         int temp = count;
  5.         count = count + 1;
  6.         return count;
  7.     }
复制代码
这个怎么理解啊?理解不了啊运行结果不是count =1?


作者: 封号了...    时间: 2013-8-15 11:49
我们来看看几个小细节:
  1. int count=0;
  2. System.out.println(count++);
复制代码
此结果为0;
再看看
  1. int count = 0;
  2. count++;
  3. System.out.println(count);
复制代码
此结果为1;
此题也就是,count++还没有改变值的时候又赋值给了自己,那么结果当然为初始值0了。
我的理解是count++只有在后面有";"的时候,也就是完全执行的时候才会自增1;
当然9楼理论很像try中的return跟finally谁先执行,
还有哪些类似的例子,楼下补上!!
作者: 华行天下    时间: 2013-8-15 13:49
直接count=count+1;这样就不会出现优先级的问题;
作者: binghaiwang    时间: 2013-8-15 13:54
你这个count是先进行赋值运算再自增的 ,然后每次都是0赋值给count最后肯定还是0
作者: swolice    时间: 2013-8-15 14:23
你这个count肯定是0嘛,i和count根本就没关系啊。你的自增变量是i啊。其实你想写的程序是这样的:其他都不变,把count=count+i;就可以了。就会得到你想要的结果。
作者: swolice    时间: 2013-8-15 14:25
华行天下 发表于 2013-8-15 13:49
直接count=count+1;这样就不会出现优先级的问题;

哥,你这个最后的结果只是把count自增十次后的运算结果赋给count而已,你这个结果应该也不是楼主想要的。应该是count=count+i;

作者: panningwjr    时间: 2013-8-15 15:14
邪恶飞猫 发表于 2013-8-14 13:48
这里需要弄清楚java 自增的原理。首先要明确,count++是一个表达式,有返回值,它不是一个变量(再注意一遍 ...

懂了,谢谢!

作者: 杨增坤    时间: 2013-8-19 21:09
薛鹏鹏 发表于 2013-8-15 11:07
这个怎么理解啊?理解不了啊运行结果不是count =1?

我感觉应该可以这样理解:就是先存储给一个变量,返回的变量本身的值,而不是增加后的!

作者: 薛鹏鹏    时间: 2013-8-20 08:30
forward 发表于 2013-8-19 21:09
我感觉应该可以这样理解:就是先存储给一个变量,返回的变量本身的值,而不是增加后的!
...

嗯,明白了,每次都是0赋给count
作者: 昝文萌    时间: 2013-8-20 10:38
看了这个问题和大家的总结,我也很疑惑,然后又查了一些资料,想把这个问题的解释理一下!
1、a++:a先创建自身的一个临时副本,然后a自增1,最后返回副本的值。
   ++a:不会创建临时副本,直接返回a加1后的值。
2、
  1. int count=0;
  2. count=count++;
复制代码
因为count++的优先级高于=,所以先计算count++,此时先在内存创建一个count的临时副本值为0,然后count加1,count的值为1。然后进行赋值运算,count++表达式返回副本里的值0,把0赋给count(此时count的值为1),结果count的值又变成0了。
下面这个程序很好的说明了问题:
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int count=0,a=1;
  6.                 a=count++;//这里a的值会被count++表达式赋值为0(count++返回的是临时副本里的0,   count的值变成了1)
  7.         System.out.println("a="+a);
  8.                 System.out.println("count="+count);//这里输出count的值为1
  9.                 }
  10. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2