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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© up_ 中级黑马   /  2012-10-22 00:35  /  3895 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Demo {
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技术分 +1 收起 理由
杨志 + 1 javap!

查看全部评分

13 个回复

正序浏览
王威 中级黑马 2012-10-22 22:56:28
14#
赵红萍 发表于 2012-10-22 22:36
也就是说,每次循环的时候,先把0赋给了count,然后count自增,变成1,但是并没有把1赋值给count,所以count的 ...

对头,就是这个道理!
回复 使用道具 举报
王威 发表于 2012-10-22 07:29
给你深入解析下:
看例子
public class Test

也就是说,每次循环的时候,先把0赋给了count,然后count自增,变成1,但是并没有把1赋值给count,所以count的值仍然是0,每次循环都是执行这样的操作,所以count的值一直都是0
回复 使用道具 举报
比如:a=b++,这时b先把自己原来的值赋给a,然后再自己+1;
再比如:a=++b,这时b会在自己+1,再把运算结果赋给a
现在回到你的程序中,count=count++,count永远会先把0赋给count,不管你循环多少遍,count的值也都不会变了
回复 使用道具 举报
秦松 中级黑马 2012-10-22 21:10:38
11#
public class Demo {
public static void main(String[] args) {
int count =0;
for(int i=0;i<10;i++){
    count++; //此处修改了一下
}

  }
System.out.println("count="+count);  //把输出语句放到了外面一层括号里 执行完循环后打印
}


*
*
*
*

点评

你的输出语句是在主函数外面的,是不会执行的  发表于 2012-11-4 19:10
回复 使用道具 举报
王威 发表于 2012-10-22 07:29
给你深入解析下:
看例子
public class Test

这个解释,我很赞同。
回复 使用道具 举报
占琳 中级黑马 2012-10-22 09:33:40
9#
       
public class Demo {
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在自增1 而他本身是恒定的0  所以打印出来的结果也是0
回复 使用道具 举报
7℃洋 中级黑马 2012-10-22 09:11:54
8#
因为你把"int count=0"定义为for循环的外部变量了,而for循环里边的count只在for循环里边有用,当for循环语句执行完的时候就不存在了。
而打印语句"System.out.println("count="+count); "也在for循环外部,并且至始至终都没有变,所以你打印是count的初始值=0

回复 使用道具 举报
  1. 用几句通俗易懂的大白话讲一遍过程就是: Java在执行    变量=i++; 在执行变量赋值语句(不是常量赋值,而是例如:i = a;即赋值号后面有变量)之前,会先把i的值找个地方保存起来,然后直接在i变量的空间内对值+1,然后再把刚才保存起来的那个值赋给变量。
复制代码
对于 i = i++ 这类表达式,两边的变量都是同一个变量,就像上面说的,结果会是保持不变。
所以这种写法本身似乎没有什么意义,为了达到+1的效果,直接i++就可以了。
回复 使用道具 举报
count=count++;
这条语句的运算过程:
1,先把count的值保存起来,比如存在了counttemp中,(数值为0);
2,在count变量的内存空间内对值+1,也就是count加1,(数值为1);
3,将第一步中的count保存的值即counttemp 赋给 “=”左边的count。
   此时,count的数值=counttemp的数值=0。之后的循环中执行结果和此时一样,
count都为0。



评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 杨雪松 于 2012-10-22 08:46 编辑

关键还是你这个count=count++;让人摸不着头脑了,
如果想搞个自增的话count++;就够了,因为他就等于count=count+1;
再给你个例子:
  1. class Demo
  2. {

  3. public static void main(String[] args)
  4. {
  5.      int i=5,p,j=5,q;
  6.       p=(i++)+(i++)+(i++);
  7.       q=(++j)+(++j)+(++j);
  8.      System.out.print("p="+p+"\nq="+q);
  9.   }

  10. }
复制代码
p=18
q=21


回复 使用道具 举报
本帖最后由 王威 于 2012-10-22 07:32 编辑

给你深入解析下:
看例子
public class Test
{  
    public static void main(String[] args)
     {   
      int i = 0;   
      i = i++;   
      System.out.println(i);
      }
}
这段代码输出结果是0,来看看反编译的到字节码,看看字节码执行过程
通过运行命令:javap –c Test  得到如下结果:

解释执行过程:
0: iconst_0 //将int类型常量0压入栈(栈顶)
1:istore_1 //将int类型值存入局部变量1
2: iload_1//从局部变量1中装载int类型值 也就是说,这个时候把i变量中的值拿出来了,压入栈(栈顶),因为这里执行的是i++, 也就是先使用后++,所有这句的目的是想把i在++之前的值先找个地方保存起来。
3:iinc 1,1// 把常量值1加到局部变量1上 这句话执行后i变量中存放的值就不是0了,而是1,注意:刚才压入栈的那个值,也就是i在++之前的值,即栈顶的值仍然是0
6:istore_1//把栈顶的int类型的值存入变量1中 这句话就是用栈顶的0把i变量中的1给替换掉了。 所以最后得出了i=0的结果。

       用几句通俗易懂的大白话讲一遍过程就是: Java在执行    变量=i++; 在执行变量赋值语句(不是常量赋值,而是例如:i = a;即赋值号后面有变量)之前,会先把i的值找个地方保存起来,然后直接在i变量的空间内对值+1,然后再把刚才保存起来的那个值赋给变量。





评分

参与人数 1技术分 +2 收起 理由
杨志 + 2 很不错哦!

查看全部评分

回复 使用道具 举报
nt count =0;
for(int i=0;i<10;i++){
    count=count++;
}
System.out.println("count="+count);
  }
      count++是先使用再运算,所以每次都是赋值零,++可能是没有运算,也可能是加的不是count本身。 可以改成 count = i; 不要写成楼上的i++。 要不就只写上count++,不要写赋值语句。
        for(int i=0;i<10;i++){
           count++;
        }
回复 使用道具 举报
因为count=0;你在程序中没有给count赋新的值。你可以改成count=i++;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马