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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田建 高级黑马   /  2012-8-3 20:24  /  5407 人查看  /  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 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;下一个循环也是这样

回复 使用道具 举报
i++是在先调用后加1,先调用i的值,后让i+1  如: i= 0 i++ 使用是0,使用后变成 1
++i则是先加1后调用,先让i+1后再调用i新值的值  
回复 使用道具 举报
周坤 发表于 2012-8-4 14:59
count=count++;这句,不是先做count++,再赋值给count,那是怎么运行的?难道是(count=count)++,这样 ...

在题目上已经给出了解答,请参见!
回复 使用道具 举报
i=i++与i=++i的区别在于:前者是先赋值,再进行加1运算,后者是先进行加1运算,再赋值。所以此处for循环执行了10次count=count++,就相当于执行了10次
count=count,而count初值是0,所以结果还是0。
回复 使用道具 举报
结果为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);
}
}
如果代码这样修改的话就打印的就是最后累加的结果了。

回复 使用道具 举报
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就是另外一个结果了。
回复 使用道具 举报
前面的赋值语句和循环语句就不说了,亮点在count=count++;   我的理解是:首先count在上面赋值为0,进入该语句,先将右侧的值赋给左侧的count,即count=0,然后再做加1的操作,再次循环的时候,count的值在上一次循环中被赋值为0,因为即使在上一次循环末尾中有加1的操作,但是没有赋值给变量count,所以在第二次循环中count值依旧为0,多少次循环都一样。     本人理解较为肤浅,请老师指正!
回复 使用道具 举报
田建 发表于 2012-8-4 13:43
你的回答其实是有问题的,你说:“count=count++;主要是这句,先做count++然后再赋值”这显然是不对的哈 ...

count=count++;这句,不是先做count++,再赋值给count,那是怎么运行的?难道是(count=count)++,这样?
回复 使用道具 举报
周坤 发表于 2012-8-4 09:23
我的理解不对?

你的回答其实是有问题的,你说:“count=count++;主要是这句,先做count++然后再赋值”这显然是不对的哈!
回复 使用道具 举报
原来我一直以来的理解是错的,count=0;count=count++,以前的理解是count先被赋值0,然后加1,再被赋值为1,从这个例子来看:
     count里的“++”并没有赋值功能,所以count始终为0
   
回复 使用道具 举报
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);

}

}
最后结果为零
回复 使用道具 举报
这里涉及到一个关于栈区和临时变量区的数据问题!
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    运算后依旧为0  

}

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

}

}
最后结果为零
回复 使用道具 举报
周坤 发表于 2012-8-4 09:23
我的理解不对?

你的理解正确,但是你跟7楼意思一样了。
你的技术分已经达到21分了,所以比较严格点了。
我觉得田兄是这么理解的,如果你想申请加技术分,也是可以的。
但是,当达到你这种地步,的确严格了点,嘿嘿
回复 使用道具 举报
周坤 发表于 2012-8-3 21:18
06.count=count++;主要是这句,先做count++然后再赋值。
其实就是a=count++,然后将a赋值给count。
开始cou ...

我的理解不对?
回复 使用道具 举报
本帖最后由 张扬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 加油!

查看全部评分

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

评分

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

查看全部评分

回复 使用道具 举报
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

评分

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

查看全部评分

回复 使用道具 举报
运行结果生意 count=0  原因是 先执行count=0 所以不管怎么运行 都是在运行count=0
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马