黑马程序员技术交流社区

标题: 来,大家提提神 [打印本页]

作者: 杨_扬    时间: 2012-7-6 09:53
标题: 来,大家提提神
请看如下程序
public class Increment{
     public static void main(String[] args){
          int j = 0;
          for (int i=0; i<100; i++)
                j=j++;
          System.out.println(j);
     }
}
看完这个程序,请先在脑子中想象一下运行结果
然后放到你的编译器里运行一下
如果运行结果和你想象的不一样
请回复说 “哇,我中招了” :)
作者: 柯玲    时间: 2012-7-6 10:04
我没有中招,就算出的j=0,因为j从始至终既没参与运算,所以还是它显示初始化的值:0
作者: 杨_扬    时间: 2012-7-6 10:07
柯玲 发表于 2012-7-6 10:04
我没有中招,就算出的j=0,因为j从始至终既没参与运算,所以还是它显示初始化的值:0 ...

恩,虽然你回答对了问题的答案,但原理你说错了,j从始至终都在参与运算
作者: 柯玲    时间: 2012-7-6 10:16
杨_扬 发表于 2012-7-6 10:07
恩,虽然你回答对了问题的答案,但原理你说错了,j从始至终都在参与运算 ...

我刚才测过了,在for循环里面循环了100次,但j每次的结果都为0,不知道这些代码的意义何在?
作者: 孙飞    时间: 2012-7-6 10:25
本帖最后由 feigecal 于 2012-7-6 10:28 编辑

因为每次j都是先把0赋给j再自增的,所以把0给自己赋了100次,把j=j++改成j++或者j=++j就成了正常想像的那个结果了
作者: 张华廷    时间: 2012-7-6 10:42
结果循环一百次打印0,因为每次j都是先把0赋给j再自增的,循环打印100次;这个问题就是自增的问题,在循环里j++和++j问题的理解;循环中j++或者j=++j结果从0打印到99.
作者: 李志广    时间: 2012-7-6 11:12
public class Increment{
     public static void main(String[] args){
          int j = 0;
          for (int i=0; i<100; i++)
                j=j++;
          System.out.println(j);
     }
}

将你的代码改为:
public class Increment
        {
     public static void main(String[] args)
                 {
                       int j = 0;
                        for (int i=0; i<100; i++)
                         {
                                 j=++j;
                             System.out.println(j);
                          }
     }
}
你的问题就解决了!
因为你的程序中,因为每次j都是先把0赋给j再自增的,所以把0给自己赋了100次 。还有你少了一对大括号,这样的话,即使改成j=++j; 它只是输出100这个数字,因为System.out.println(j); 打印的只是输出结果,并没有参加循环!{:soso_e100:}


作者: 韩新凯    时间: 2012-7-8 06:34
循环中的j没有吧值传出来
输出的还是外面的j
作者: 黑马-李勇    时间: 2012-7-8 08:58
我中了{:soso_e113:}
对j付值的只有j=j++这一句。
j=j++拆开运算,j本身为零,执行j=j就是j=0,然后J加1,注意这里没有了,加一后没有对j操作了。所以j还是零,这是我的理解,可以扔板砖。

作者: 张天天    时间: 2012-7-8 09:29
细节啊决定成败
作者: 张天天    时间: 2012-7-8 09:35

public class Increment{
    public static void main(String[] args){
         int j = 0;
         int k = 0;
         for (int i=0; i<10; i++)
               j=j+1;
             k = ++k;
         
         System.out.println(j);
         System.out.println(k);
         
    }
}
结果是
10
1
为什么会这样啊for循环的默认循环体难道说只是下面的一行吗
作者: 曹恒业    时间: 2012-7-8 10:01
看了上面大家的观点,虽说结果都对,但原理解释起来好像有问题。
大部分人都说“因为每次 j 都是先把0赋给 j 再自增的,所以把0给自己赋了100次”,后半句是没有问题,确实是 j 被0赋值100次。
可是前半句的说法上有问题,如果是“每次都先把0赋值给 j 再自增”,那岂不是执行的是“ j = j; j++;”?
而实际上“ j = j++; ”,这个语句的执行过程是,从赋值运算符右边开始先执行 j++,此时 j 的值已经是 1了,只不过参与运算的值是0,然后执行的是把0赋值给值已经变为1的 j,如此才解释的通。
否则,如果 j++在赋值之后完成,那 j 的值应该每次循环都能自增。
这个程序的意义在于,让我们更细致的了解了所谓自增运算的原理。
作者: 龚建锋    时间: 2012-7-8 10:28
j=0,因为j=j++表示在运算中右边的j先将初始化值0赋给左边的再自增,执行到这就把j的值打印出来了
作者: 王德南    时间: 2012-7-8 10:40
{:soso_e100:}




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