黑马程序员技术交流社区

标题: 结果为什么是0? [打印本页]

作者: 闯天涯    时间: 2014-4-17 22:16
标题: 结果为什么是0?
public class Test3 {
    public static void main(String[] args) {
        int j = 0;
        for (int i = 0; i < 100; i++)
              j = j++;
        System.out.println(j);
    }
}
自己查了一些资料,也问了一些老师,可是总是有些不能白,就是那种感觉要抓到可是有没有抓到的感觉,谁能帮我通俗的讲解一下,谢谢了!
作者: 向阳泪无痕    时间: 2014-4-17 22:49
首先  你这里 for 循环没起到用是吧  
看你这个问题 就知道 你主要是不明白  j++  ++j 这两个的区别
j++ 表示 先使用 j 后 ,然后才 ++
++j 表示 先++ 后,然后才使用 j
如:
     你题中  j = 0;
     
     a = j++;   和  b = ++j;
   
     这里   a = 0;  然后 ++  , j 变成 1 了,
     第二个呢,是先++ 那就是 b = 1;
   
作者: 程序爱好者    时间: 2014-4-17 23:59
都是 自加语句,执行后 j值自加1
++j  在执行运算时 i值先自加1,椅子加后的值进行运算
j++  在执行运算时,先进行运算,运算完后 j值加1

例:

j=1;

System.out.println(j++); 输出的是 1

System.out.println(++j); 输出的是 2
作者: 土突突    时间: 2014-4-18 01:22
这个与java虚拟机对i=i++的处理有关。为简单起见,不妨对源代码改造如下

  1. i=0;
  2. j=i++;
  3. System.out.println(j);
复制代码

由于i和j为局部变量,故存储在栈内存中,java虚拟机对上述过程的处理过程如下:
1.把常量0存储在栈顶
2.把栈顶的值(为常量0)赋给变量i,此时栈顶的值仍然为0,i的值为0,相当于执行i=0;
3.把i的值取出放到栈顶。此时栈顶的值为i的值,为0
4.把i的值自增1,此时i的值为1,栈顶仍然为0
5.把栈顶的值取出赋给变量j,此时j值为0,i值为1
以上过程后,j的值为0,i为1。无疑是正确的
可当把j=i++变为i=i++,则在步骤5中则变为把栈顶的值(0)赋给变量i,此时i又变为0。故无论循环多少次i的值最后都为0

作者: centian2005    时间: 2014-4-18 18:28
  int j = 0;
        for (int i = 0; i < 100; i++)//这里for循环,少了一个大括号
              j = j++;
        System.out.println(j);

给你写标准点 for (int i = 0; i < 100; i++){
              j = j++;
}

  System.out.println(j);//这里打印的j,是上面定义的int j=0;的这个j
for循环里的j,再怎么变化,出了这个for循环,就无效了。
作者: 闯天涯    时间: 2014-4-18 21:38
向阳泪无痕 发表于 2014-4-17 22:49
首先  你这里 for 循环没起到用是吧  
看你这个问题 就知道 你主要是不明白  j++  ++j 这两个的区别
j++ 表 ...

开始j=0.赋值给j,j为0,然后j+1赋值给j,j不就应该为0吗?
作者: 向阳泪无痕    时间: 2014-4-18 23:25
闯天涯 发表于 2014-4-18 21:38
开始j=0.赋值给j,j为0,然后j+1赋值给j,j不就应该为0吗?

j = j ++ ;   右边 j 运算前先把值赋值给 j  这个时候 j =0;  所以  左边 j = 0; 而这个时候呢,右边 j 在 ++ 变成了 1 ,但是,它加完后,并没有赋值给 j  ,因为在++前 已经赋过值了是吧。 所以这个时候 输出的就是 0
如果你改成这种
a = j++;
System.out.println( j );  这样 输出的就是 1 了
作者: 土突突    时间: 2014-4-23 00:52

  1. i=0;
  2. j=i++;
  3. System.out.println(j);
复制代码
这个与java虚拟机对i=i++的处理有关。为简单起见,不妨先分析以上源代
由于i和j为局部变量,故存储在栈内存中,java虚拟机对上述过程的处理过程如下:
1.把常量0存储在栈顶
2.把栈顶的值(为常量0)赋给变量i,此时栈顶的值仍然为0,i的值为0,相当于执行i=0;
3.把i的值取出放到栈顶。此时栈顶的值为i的值,为0
4.把i的值自增1,此时i的值为1,栈顶仍然为0
5.把栈顶的值取出赋给变量j,此时j值为0,i值为1
以上过程后,j的值为0,i为1。无疑是正确的
可当把j=i++变为i=i++,则在步骤5中则变为把栈顶的值(0)赋给变量i,此时i又变为0。故无论循环多少次i的值最后都为0


作者: chensc    时间: 2014-5-27 08:12
学习学习!
作者: 1007087594    时间: 2014-5-27 10:29
路过……
作者: chensc    时间: 2014-6-6 08:02
学习学习!




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