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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡建彪 黑马帝   /  2012-10-17 10:23  /  3481 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

给大家看看一道坑人的小程序。
public class ForTest {

    public static void main(String[] args) {
        int j=0;
        for(int i=0;i<100;i++){
            j=j++;
        }
        System.out.println(j);

    }

}
结果令你傻眼,大神们一起共勉,欢迎讨论。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

14 个回复

正序浏览
结果应该是0
回复 使用道具 举报
王虎 中级黑马 2012-10-17 21:31:48
14#
王虎 发表于 2012-10-17 11:19
那是因为循环结束后才执行System.out.println(j);
java里程序的执行顺序你要搞明白啊,这个就是“从上到下 ...

不好意思,我解释的好像不太对,这个问题我又想了想,问了问别人也没想明白,希望有明白的给详细解释下吧
j=j++    输出结果是0
j=++j    输出结果是100
j+=1     输出结果是100

搞的我也很迷糊了,郁闷。。。
回复 使用道具 举报
乔九 中级黑马 2012-10-17 20:43:24
13#
王虎 发表于 2012-10-17 11:19
那是因为循环结束后才执行System.out.println(j);
java里程序的执行顺序你要搞明白啊,这个就是“从上到下 ...

把它放入main函数中还是打印100个0啊?
回复 使用道具 举报
马磊 中级黑马 2012-10-17 20:14:09
12#
先说一般情况下 :
例如 int b=a++;此语句会先在内存空间中创建一个b的区域,然后把a的值放入到一个临时空间,然后a的值自加1,然后再把临时空间里的值放到b中去。这时候b的值还是原来a的值,而a已经是加1后的值了,所以通俗说法是先赋值后++;

a=a++,同样分析一下:a先把自己的值放到一个临时空间里,然后a再自加1,然后(这里就是问题所在了)临时空间里a原来的值又赋值给了a,所以a还是原来的值。因此是有a+1的过程的,不过后来被临时空间里原来的a值覆盖掉了。

点评

顶一个  发表于 2012-10-17 20:57
回复 使用道具 举报
舒远 发表于 2012-10-17 16:39
看看我下面说的中不中?
j=j++;的实际运行过程如下:
int temp = j;

说的很对。
应该尽量少的使用后自增
回复 使用道具 举报
胡建彪 黑马帝 2012-10-17 18:03:27
10#
王威 发表于 2012-10-17 17:22
这样说你就明白了,这也是我在网上找了一下
public class ForTest {
public static void main(String[] ar ...

Thank you ,我也觉得在C语言中不是这样
回复 使用道具 举报
王威 中级黑马 2012-10-17 17:22:38
9#
这样说你就明白了,这也是我在网上找了一下
public class ForTest {
public static void main(String[] args) {
  int j =  0;
  for(int i=0;i<100;i++)
   j = j++;
  System.out.println(j); //输出的结果为 0
  
  // 因为在java中的这样的赋值相当于下面的赋值操作,
  //   temp = j;
  //   j = j+1 ;
  //   j = temp;
  // 所以运行后的结果还是原来的那个j值为0,但是在C和C++中就不是这样的了,
}
}
回复 使用道具 举报
胡建彪 黑马帝 2012-10-17 16:59:05
8#
马良 发表于 2012-10-17 11:18
嗯···我打印的结果是0
本来是想班门弄斧,给您解答一下来着的,哪知道自己研究了一下,发现自己也遇到问 ...

Thanks  for replying.
回复 使用道具 举报
舒远 黑马帝 2012-10-17 16:39:27
7#
本帖最后由 舒远 于 2012-10-17 16:43 编辑

看看我下面说的中不中?
j=j++;的实际运行过程如下:
int temp = j;
j=j+1;//这步操作等于没做。。
j=temp;

这是内存中的运行原理(java对于后置自增、自减操作采用的中间缓存变量机制)。。
回复 使用道具 举报
那是因为循环结束后才执行System.out.println(j);
java里程序的执行顺序你要搞明白啊,这个就是“从上到下”
还有从左到右,或根据具体调用方法的位置(比如一个对象调用方法执行完后还回到方法调用处)

点评

话说在里面syso也是0.。。。  发表于 2012-10-17 20:51

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 马良 于 2012-10-17 11:36 编辑

嗯···我打印的结果是0
本来是想班门弄斧,给您解答一下来着的,哪知道自己研究了一下,发现自己也遇到问题了

主要的问题就出现在j=j++;那里。
按照学过的知识理解,当然是分步:

1、右边的j首先赋值给左边的j。
2、然后就是,j自己进行+1操作,关键就在这里:j在+1操作的时候,就变成了1,但是这个1有没有保存下来呢?当然,看结果的话,这个1肯定没有保存下来,在进行第二次循环之前,他就自动变回0了。

以上纯属个人理解,内存里是一个什么样的状态我也不懂。嘿嘿····{:soso_e113:}
(我是一只努力的菜鸟)


再补充一下啊,刚去其他地方问了,
刚才的情况,先赋值,后运算, 在后面运算时,出了结果,但是你没有去接收这个结果.
这么说, 你运算一个公式, 例如 0+1 ,会返回一个结果 1.
这时候这个1,需要你用个篮子去接收才可以.
如果你不接收,这个1就不能被你使用 ,那么,那个j就还是0;

不知道这能不能帮助到你!


评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王虎 发表于 2012-10-17 11:01
这不是什么陷阱是前缀式和后缀式的问题,
前缀式即(++j   --j) :先做自加或自减操作,在去参与运算;后缀式 ...

嗯,j=j++; 这句话执行完了之后,即使是后进行自加自减操作, j 的值该有增加的啊,我是想说  j 的值一直没有增加源于何?
回复 使用道具 举报
这不是什么陷阱是前缀式和后缀式的问题,
前缀式即(++j   --j) :先做自加或自减操作,在去参与运算;后缀式即(j++    j--):先取值参与运算,在做自加自减操作

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
傻眼{:soso_e114:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马