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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田建 高级黑马   /  2012-8-3 20:24  /  5391 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田建 于 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;

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
职业规划-刘倩老师 + 1 赞一个!
张_涛 + 10 很给力!

查看全部评分

25 个回复

倒序浏览
是不是代码写错了啊
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);

        }

}
回复 使用道具 举报
这个问题原来一直弄不清楚,通过这次学习,终于弄明白了,count=count++,count的初始值为0,此处是先赋值再做加1操作,相当于一直在重复count=count,即为0.
所以最后输出结果应该为0.

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
十分不好意思 上个回答原来是我弄错了, 出丑了······



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

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

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

回复 使用道具 举报
早以前做过这样的实验,当时没搞明白,后来我们老师说跟寄存器有关系,但是他说到底怎么回事记不清了,所以也没讲出来。
后来我是这样想的:
先执行(count++),这时候(count++)仍然为0,然后把0赋给count,所以count始终是0,至于后来count有没有++就不知道了,有两种可能,一是count执行++了(++后的结果应该会在内存产生一个新的结果),但是这个结果并没有赋给count,二是count没++不知道对不对{:soso_e121:}
回复 使用道具 举报
呵呵
回复 使用道具 举报
我们昨天考试刚刚考到这道题,这道题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。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

回复 使用道具 举报
运行结果生意 count=0  原因是 先执行count=0 所以不管怎么运行 都是在运行count=0
回复 使用道具 举报
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-4 07:39

评分

参与人数 1黑马币 +15 收起 理由
田建 + 15 神马都是浮云

查看全部评分

回复 使用道具 举报
就是 ++先运算后运算的问题; count=count++; 这样是先赋值在运算  如果 count = ++count; 这样就是想运算在赋值  ; 这道题是先赋值在运算 多以count的值始终是0 多以结果为0;

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 鼓励一下!

查看全部评分

回复 使用道具 举报
本帖最后由 张扬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
这样算回答的好么?给分么?哈哈。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

回复 使用道具 举报
周坤 发表于 2012-8-3 21:18
06.count=count++;主要是这句,先做count++然后再赋值。
其实就是a=count++,然后将a赋值给count。
开始cou ...

我的理解不对?
回复 使用道具 举报
周坤 发表于 2012-8-4 09:23
我的理解不对?

你的理解正确,但是你跟7楼意思一样了。
你的技术分已经达到21分了,所以比较严格点了。
我觉得田兄是这么理解的,如果你想申请加技术分,也是可以的。
但是,当达到你这种地步,的确严格了点,嘿嘿
回复 使用道具 举报
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);

}

}
最后结果为零
回复 使用道具 举报
这里涉及到一个关于栈区和临时变量区的数据问题!
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 去运行源代码。
去看看在内存中时如何实现的!
回复 使用道具 举报
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);

}

}
最后结果为零
回复 使用道具 举报
原来我一直以来的理解是错的,count=0;count=count++,以前的理解是count先被赋值0,然后加1,再被赋值为1,从这个例子来看:
     count里的“++”并没有赋值功能,所以count始终为0
   
回复 使用道具 举报
周坤 发表于 2012-8-4 09:23
我的理解不对?

你的回答其实是有问题的,你说:“count=count++;主要是这句,先做count++然后再赋值”这显然是不对的哈!
回复 使用道具 举报
田建 发表于 2012-8-4 13:43
你的回答其实是有问题的,你说:“count=count++;主要是这句,先做count++然后再赋值”这显然是不对的哈 ...

count=count++;这句,不是先做count++,再赋值给count,那是怎么运行的?难道是(count=count)++,这样?
回复 使用道具 举报
前面的赋值语句和循环语句就不说了,亮点在count=count++;   我的理解是:首先count在上面赋值为0,进入该语句,先将右侧的值赋给左侧的count,即count=0,然后再做加1的操作,再次循环的时候,count的值在上一次循环中被赋值为0,因为即使在上一次循环末尾中有加1的操作,但是没有赋值给变量count,所以在第二次循环中count值依旧为0,多少次循环都一样。     本人理解较为肤浅,请老师指正!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马