黑马程序员技术交流社区

标题: 对i++和++i有疑问的来看看这个小题目! [打印本页]

作者: 田建    时间: 2012-8-3 20:24
标题: 对i++和++i有疑问的来看看这个小题目!
本帖最后由 田建 于 2012-8-4 07:35 编辑

之前看到有些朋友问有关i++和++i的问题,这里有个小问题,希望能帮大家彻底解决这个问题,大家看下面的程序,不要运行,直接说答案,并解释原因,回答的好的,照样给予加分!
  1. class Test{
  2. public static void main(String[] args){

  3. int count=0;
  4. for(int i=0;i<10;i++){
  5. count=count++;
  6. }
  7. System.out.println("count="+count);
  8. }
  9. }
复制代码
值为0:
过程为:
1、JVM把count拷贝到临时变量区
2、count值加1;
3、返回临时变量区的值(特别注意);
4、返回值赋给count;
作者: 戎石锁    时间: 2012-8-3 20:36
是不是代码写错了啊
class Test1
{
        public static void main(String[] args)
        {

                int count=0;

                for(int i=0;i<10;i++)
                {
                        count=count++;//这个应该不对吧 应该是count=i++;
                }

        System.out.println("count="+count);

        }

}

作者: 张伟强    时间: 2012-8-3 20:41
这个问题原来一直弄不清楚,通过这次学习,终于弄明白了,count=count++,count的初始值为0,此处是先赋值再做加1操作,相当于一直在重复count=count,即为0.
所以最后输出结果应该为0.
作者: 戎石锁    时间: 2012-8-3 20:46
十分不好意思 上个回答原来是我弄错了, 出丑了······



程序的执行顺序是这样的:因为++在后面,所以先使用i,“使用”的含义就是i++这个表达式的值是0,但是并没有做赋值操作,它在整个语句的最后才做赋值,也就是说在做了++操作后再赋值的,所以最终结果还是0

让我们看的更清晰点:
int count= 0;//这个没什么说的
count=count++;//等效于下面的语句:

int temp = i;//这个temp就是i++这个表达式的值
i++; //i自增
i = temp;//最终,将表达式的值赋值给i


作者: 王志明    时间: 2012-8-3 20:53
早以前做过这样的实验,当时没搞明白,后来我们老师说跟寄存器有关系,但是他说到底怎么回事记不清了,所以也没讲出来。
后来我是这样想的:
先执行(count++),这时候(count++)仍然为0,然后把0赋给count,所以count始终是0,至于后来count有没有++就不知道了,有两种可能,一是count执行++了(++后的结果应该会在内存产生一个新的结果),但是这个结果并没有赋给count,二是count没++不知道对不对{:soso_e121:}
作者: 田向向    时间: 2012-8-3 20:59
呵呵
作者: 官文昌    时间: 2012-8-3 21:12
我们昨天考试刚刚考到这道题,这道题count=count++相当与(int temp=count;count=count+1;count=temp;)不管你怎么循环,第一步的temp==0(因为count最开始是等于0的)的,最后temp把值赋给count,所以它的最后结果就是count==0,这是便于理解的,
更深层次的原因:首先你的count是全局变量,类里面的任何一个变量该变了count的值,它的值都会变的,当你程序执行到count=count++时,首先是赋值后才执行++的运算,count==0,当你++后,你没有执行赋值运算,所以count还是0,所以它的结果一直是0~~关键点就是当++后它没有把新值赋给count。


作者: 樊占江    时间: 2012-8-3 21:13
运行结果生意 count=0  原因是 先执行count=0 所以不管怎么运行 都是在运行count=0
作者: 周坤    时间: 2012-8-3 21:18
06.count=count++;主要是这句,先做count++然后再赋值。
其实就是a=count++,然后将a赋值给count。
开始count=0;,那么a=count++,执行完这句后,a=0;count=1;
然后再执行a赋值给count,此时就把count=1给覆盖掉了,count的值又变回了0;
所以count=count++,此语句之后count还是0.
那么最终输出为count=0.
若是改成count=++count,那么就是先自加再赋值,赋值的时候count就等于1了,所以最终
输出为count=10
作者: 王晓龙    时间: 2012-8-3 23:13
就是 ++先运算后运算的问题; count=count++; 这样是先赋值在运算  如果 count = ++count; 这样就是想运算在赋值  ; 这道题是先赋值在运算 多以count的值始终是0 多以结果为0;
作者: 张扬123    时间: 2012-8-4 00:07
本帖最后由 张扬123 于 2012-8-4 00:10 编辑

class Test{
public static void main(String[] args){

int count=0;//把0赋值给count
for(int i=0;i<10;i++){ //for循环
count=count++;//count先赋值,再自增。count=0。自增以后并不赋值。
}
System.out.println("count="+count); //这个语句在循环体外,所以只打印一次count=0.
}
}
结果是count=0
这样算回答的好么?给分么?哈哈。
作者: 周坤    时间: 2012-8-4 09:23
周坤 发表于 2012-8-3 21:18
06.count=count++;主要是这句,先做count++然后再赋值。
其实就是a=count++,然后将a赋值给count。
开始cou ...

我的理解不对?
作者: 张_涛    时间: 2012-8-4 09:30
周坤 发表于 2012-8-4 09:23
我的理解不对?

你的理解正确,但是你跟7楼意思一样了。
你的技术分已经达到21分了,所以比较严格点了。
我觉得田兄是这么理解的,如果你想申请加技术分,也是可以的。
但是,当达到你这种地步,的确严格了点,嘿嘿

作者: 宋启龙    时间: 2012-8-4 09:44
class Test{

public static void main(String[] args){



int count=0;//    count的值为1   count现在只代表一个变量名

for(int i=0;i<10;i++){         //进入循环

count=count++;          //  根据a++的运算规则   count初始值为0    运算后依旧为0  

}

System.out.println("count="+count);

}

}
最后结果为零
作者: 杨志    时间: 2012-8-4 09:47
这里涉及到一个关于栈区和临时变量区的数据问题!
i
  1. i++;
复制代码
那么就会先将i的值压入到栈区,然后再去在临时变量区将i的值加1.
认真分析顺序为:
先将count的值赋值为0。
然后压入栈区
接下来在临时变量去对i的值进行自加1.
然后再将栈区的值赋值给自己。
也就相当于没有赋值。
然后循环。最后输出的当然是0.
那么好的!这里分析下++i是怎么样做的。
  1. ++i;
复制代码
会先在临时变量区存储i,然后现在临时变量区将i的值自加1,在压入栈区。
这样的栈区的值就会是自加后的结果。
那么理解了上面的。我们来看点复杂点的东西。
  1. int i = 0 ;
  2. i = i ++  + ++i;
复制代码
这里的结果又是多少呢!
那么好 !我们来分析下!
首先,将i=0 压入栈区。
然后再临时变量区加1。
那么这时栈区的值还是1,但是由于++运算符的优先级要高于+
所有继续执行++i的操作。在栈区对i的值进行自加,然后压入栈区。
最后将两个数同时弹出。进行加法运算。
如果大家还不清楚,可以去使用javap 去运行源代码。
去看看在内存中时如何实现的!

作者: 宋启龙    时间: 2012-8-4 09:51
class Test{

public static void main(String[] args){



int count=0;//    count的值为1   count现在只代表一个变量名

for(int i=0;i<10;i++){         //进入循环

count=count++;          //  根据a++的运算规则   count初始值为0   先赋值给count再加1所以   count的值 为0

}

System.out.println("count="+count);

}

}
最后结果为零
作者: 黑马张旭明    时间: 2012-8-4 10:42
原来我一直以来的理解是错的,count=0;count=count++,以前的理解是count先被赋值0,然后加1,再被赋值为1,从这个例子来看:
     count里的“++”并没有赋值功能,所以count始终为0
   
作者: 田建    时间: 2012-8-4 13:43
周坤 发表于 2012-8-4 09:23
我的理解不对?

你的回答其实是有问题的,你说:“count=count++;主要是这句,先做count++然后再赋值”这显然是不对的哈!
作者: 周坤    时间: 2012-8-4 14:59
田建 发表于 2012-8-4 13:43
你的回答其实是有问题的,你说:“count=count++;主要是这句,先做count++然后再赋值”这显然是不对的哈 ...

count=count++;这句,不是先做count++,再赋值给count,那是怎么运行的?难道是(count=count)++,这样?
作者: 刘悦    时间: 2012-8-4 16:09
前面的赋值语句和循环语句就不说了,亮点在count=count++;   我的理解是:首先count在上面赋值为0,进入该语句,先将右侧的值赋给左侧的count,即count=0,然后再做加1的操作,再次循环的时候,count的值在上一次循环中被赋值为0,因为即使在上一次循环末尾中有加1的操作,但是没有赋值给变量count,所以在第二次循环中count值依旧为0,多少次循环都一样。     本人理解较为肤浅,请老师指正!
作者: 宫明星    时间: 2012-8-4 16:32
class Test{
public static void main(String[] args){

int count=0;
for(int i=0;i<10;i++)
{
count=count++;
}
System.out.println("count="+count);
}
}

这里面count=count++,count++是后置运算,运算过程是先赋值,后自增++。
所以这里count的值始终为0,因为循环中每次都是赋值为0。
如果是++count就是另外一个结果了。
作者: 姬仁贵    时间: 2012-8-4 16:35
结果为0 的原因是因为count=count++;这条语句。

count++因为++是后缀,关联性是左结合性,所以是先赋值再自增的  。

因为count的初始值是0   所以每次循环都做着同样的事情就是count  =  count即等于0 ;



class Test
{
public static void main(String[] args)
{

int count=0;
for(int i=0;i<10;i++){
count++;
}
System.out.println("count="+count);
}
}
如果代码这样修改的话就打印的就是最后累加的结果了。


作者: 戚题彪    时间: 2012-8-4 17:49
i=i++与i=++i的区别在于:前者是先赋值,再进行加1运算,后者是先进行加1运算,再赋值。所以此处for循环执行了10次count=count++,就相当于执行了10次
count=count,而count初值是0,所以结果还是0。
作者: 田建    时间: 2012-8-4 18:36
周坤 发表于 2012-8-4 14:59
count=count++;这句,不是先做count++,再赋值给count,那是怎么运行的?难道是(count=count)++,这样 ...

在题目上已经给出了解答,请参见!
作者: 王永杰    时间: 2012-9-5 03:23
i++是在先调用后加1,先调用i的值,后让i+1  如: i= 0 i++ 使用是0,使用后变成 1
++i则是先加1后调用,先让i+1后再调用i新值的值  
作者: 张志成    时间: 2014-4-20 21:40
class Test{

public static void main(String[] args){
int count=0;
for(int i=0;i<10;i++){
count=count++;

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

}

}

结果是:0
我的分析:   (1) int count=0;    (2)count=count++,     =count++
分析: 首先count在栈中开辟一个空间,初始值为0; 再来看看count=count++;左边的count的值为0, 右边的 count要进行赋值运算.自增运算,由于自增运算符优先级大于赋值运算符,所以先进行自增运算,
count为1,如果你认为再把1赋值给左边的count,那你就只知其一了,内存其实是这样的:
运算过程:  右边的 count会复制一份(count=0)存在栈中的一个临时空间, 然后才进行自增运算count为1值(这count是在栈中的),接着进行赋值运算,把在临时空间的count(记住这个是副本,它的值还是初始值0,并没有被改变),赋值给左边的count,结果count=0;下一个循环也是这样






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