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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨_扬 中级黑马   /  2012-7-6 09:53  /  2528 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请看如下程序
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);
     }
}
看完这个程序,请先在脑子中想象一下运行结果
然后放到你的编译器里运行一下
如果运行结果和你想象的不一样
请回复说 “哇,我中招了” :)

13 个回复

倒序浏览
我没有中招,就算出的j=0,因为j从始至终既没参与运算,所以还是它显示初始化的值:0
回复 使用道具 举报
柯玲 发表于 2012-7-6 10:04
我没有中招,就算出的j=0,因为j从始至终既没参与运算,所以还是它显示初始化的值:0 ...

恩,虽然你回答对了问题的答案,但原理你说错了,j从始至终都在参与运算
回复 使用道具 举报
杨_扬 发表于 2012-7-6 10:07
恩,虽然你回答对了问题的答案,但原理你说错了,j从始至终都在参与运算 ...

我刚才测过了,在for循环里面循环了100次,但j每次的结果都为0,不知道这些代码的意义何在?
回复 使用道具 举报
本帖最后由 feigecal 于 2012-7-6 10:28 编辑

因为每次j都是先把0赋给j再自增的,所以把0给自己赋了100次,把j=j++改成j++或者j=++j就成了正常想像的那个结果了

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
结果循环一百次打印0,因为每次j都是先把0赋给j再自增的,循环打印100次;这个问题就是自增的问题,在循环里j++和++j问题的理解;循环中j++或者j=++j结果从0打印到99.
回复 使用道具 举报
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:}

回复 使用道具 举报
循环中的j没有吧值传出来
输出的还是外面的j
回复 使用道具 举报
我中了{:soso_e113:}
对j付值的只有j=j++这一句。
j=j++拆开运算,j本身为零,执行j=j就是j=0,然后J加1,注意这里没有了,加一后没有对j操作了。所以j还是零,这是我的理解,可以扔板砖。
回复 使用道具 举报
细节啊决定成败
回复 使用道具 举报

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循环的默认循环体难道说只是下面的一行吗
回复 使用道具 举报
看了上面大家的观点,虽说结果都对,但原理解释起来好像有问题。
大部分人都说“因为每次 j 都是先把0赋给 j 再自增的,所以把0给自己赋了100次”,后半句是没有问题,确实是 j 被0赋值100次。
可是前半句的说法上有问题,如果是“每次都先把0赋值给 j 再自增”,那岂不是执行的是“ j = j; j++;”?
而实际上“ j = j++; ”,这个语句的执行过程是,从赋值运算符右边开始先执行 j++,此时 j 的值已经是 1了,只不过参与运算的值是0,然后执行的是把0赋值给值已经变为1的 j,如此才解释的通。
否则,如果 j++在赋值之后完成,那 j 的值应该每次循环都能自增。
这个程序的意义在于,让我们更细致的了解了所谓自增运算的原理。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 说的好!

查看全部评分

回复 使用道具 举报
j=0,因为j=j++表示在运算中右边的j先将初始化值0赋给左边的再自增,执行到这就把j的值打印出来了
回复 使用道具 举报
{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马