黑马程序员技术交流社区

标题: 关于自增. [打印本页]

作者: up_    时间: 2012-10-22 00:35
标题: 关于自增.
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呢
作者: 王健宇    时间: 2012-10-22 00:42
因为count=0;你在程序中没有给count赋新的值。你可以改成count=i++;
作者: 毕影彬    时间: 2012-10-22 07:26
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++;
        }
作者: 王威    时间: 2012-10-22 07:29
本帖最后由 王威 于 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,然后再把刚才保存起来的那个值赋给变量。






作者: 杨雪松    时间: 2012-10-22 08:32
本帖最后由 杨雪松 于 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 08:49
count=count++;
这条语句的运算过程:
1,先把count的值保存起来,比如存在了counttemp中,(数值为0);
2,在count变量的内存空间内对值+1,也就是count加1,(数值为1);
3,将第一步中的count保存的值即counttemp 赋给 “=”左边的count。
   此时,count的数值=counttemp的数值=0。之后的循环中执行结果和此时一样,
count都为0。




作者: 刘伟平    时间: 2012-10-22 09:01
  1. 用几句通俗易懂的大白话讲一遍过程就是: Java在执行    变量=i++; 在执行变量赋值语句(不是常量赋值,而是例如:i = a;即赋值号后面有变量)之前,会先把i的值找个地方保存起来,然后直接在i变量的空间内对值+1,然后再把刚才保存起来的那个值赋给变量。
复制代码
对于 i = i++ 这类表达式,两边的变量都是同一个变量,就像上面说的,结果会是保持不变。
所以这种写法本身似乎没有什么意义,为了达到+1的效果,直接i++就可以了。
作者: 7℃洋    时间: 2012-10-22 09:11
因为你把"int count=0"定义为for循环的外部变量了,而for循环里边的count只在for循环里边有用,当for循环语句执行完的时候就不存在了。
而打印语句"System.out.println("count="+count); "也在for循环外部,并且至始至终都没有变,所以你打印是count的初始值=0


作者: 占琳    时间: 2012-10-22 09:33
       
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
作者: 王永荣    时间: 2012-10-22 09:51
王威 发表于 2012-10-22 07:29
给你深入解析下:
看例子
public class Test

这个解释,我很赞同。
作者: 秦松    时间: 2012-10-22 21:10
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-10-22 21:54
比如:a=b++,这时b先把自己原来的值赋给a,然后再自己+1;
再比如:a=++b,这时b会在自己+1,再把运算结果赋给a
现在回到你的程序中,count=count++,count永远会先把0赋给count,不管你循环多少遍,count的值也都不会变了
作者: 赵红萍    时间: 2012-10-22 22:36
王威 发表于 2012-10-22 07:29
给你深入解析下:
看例子
public class Test

也就是说,每次循环的时候,先把0赋给了count,然后count自增,变成1,但是并没有把1赋值给count,所以count的值仍然是0,每次循环都是执行这样的操作,所以count的值一直都是0
作者: 王威    时间: 2012-10-22 22:56
赵红萍 发表于 2012-10-22 22:36
也就是说,每次循环的时候,先把0赋给了count,然后count自增,变成1,但是并没有把1赋值给count,所以count的 ...

对头,就是这个道理!




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