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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 湛添友 中级黑马   /  2014-5-25 09:45  /  2561 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  int j = 0;
       for (int i = 0; i < 10; i++){
          j= j++;
           }
      System.out.println(j);
为什么输入是0;执行j=j++时,是先把0赋给j,然后 j+1了啊?这里不是j就等于1了吗?

23 个回复

倒序浏览
j++就是先返回j的值,然后j再加一,下一次就返回j+1,

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 很给力!鼓励第一个同学~

查看全部评分

回复 使用道具 举报 1 0
j++本来就是一个赋值运算符里的自增,
意思就是每一次读这句语句时j加1然后赋值给新的j
所以j++就等同于(可以用==表示)j=j+1
回复 使用道具 举报
EDDY_Liang 发表于 2014-5-25 10:16
j++本来就是一个赋值运算符里的自增,
意思就是每一次读这句语句时j加1然后赋值给新的j
所以j++就等同于( ...

nono 不是哦
回复 使用道具 举报 1 0
J++是先用后运算
回复 使用道具 举报
你的for循环中执行相当于:
j=j;
j=j+1;
回复 使用道具 举报
你把j=去掉吧
回复 使用道具 举报
或者你j=++j,这是++j和j++的本质区别,细心点就好了
回复 使用道具 举报
你要理解j++和++j的区别,j++是先赋值再自增,++j是先自增,再赋值!!!
回复 使用道具 举报
要到下一次 j才是j+1
回复 使用道具 举报
j=j++没必要这样写,j++是先赋值再自增1,++j,就自增1再赋值
回复 使用道具 举报
很幸运我看到了这个问题,谢谢楼主啦。
谷歌了下,http://www.oschina.net/question/12_8120 这是问题的解答
回复 使用道具 举报
   j++ 就相当于 j = j + 1;

写成 j = j++ ; 就等同于写了个 j = j = j + 1;

这是很疯狂的事!
回复 使用道具 举报
j=j++????这么奇葩的语句
回复 使用道具 举报
本帖最后由 西门吹风 于 2014-5-25 22:44 编辑

在谷歌上搜到的,可以看一下


翻译:
  1. int a = 0;
  2. a = a++;
  3. System.out.println(a);
复制代码
上面打印的结果是什么?
  超过50%的程序员会回答1,一些剩余的会说“我不知道”,其他人会说0。说0的人是正确的!永远不要去写这样的代码,但出于学术目的,让我们试着理解为什么它打印0。 原因在于JLS(Java语言规范)。JLS要求在一个赋值表达式中,必须首先评估等号的右边,然后表达式的值必须分配到左边。右边首先被评估为0,因为a++是一个后自增表达式,然后这个值被保存到临时变量里。与此同时后自增表达式a++发生变化——〉a=a + 1,最后,临时变量的值分配给了a,a也就失去了增量。

如果我们把上面的代码改成虚拟码可以得到:
  1. a = 0
  2. temp = a (a++表达式的值)
  3. a = a + 1 (后增量的影响)
  4. a = temp;
复制代码
这就是为什么你得到的是0,希望已经足够清楚

回复 使用道具 举报
看了楼主的提问,以楼上的问题,感觉都不对呀,自己也查了一些资料,试验了一下,按照楼上的说法,可以解释是这样          int j = 0;
          for (int i = 0; i < 10; i++){
                 j=j=j+1;
              }
         System.out.println(j);
但是发现这个时间j的值是10,j++不就是j=j+1吗,看来是对j++的处理方式是不一样的
我参考了一下别人的资料,
   0:   iconst_0 //常数0入栈
   1:   istore_1 //j赋值,常数值出栈
                         //至此完成i=0;
   2:   iload_1  //装载变量j,0入栈
                         //第2步是特殊的一步,这步将i值先行保存,以备赋值使用
   3:   iinc 1, 1 //变量值增加,栈内值不变
                         //至此完成j++
   6:   istore_1 //j赋值,0出栈。
                         //至此完成j=j++
   7:   nop  //donothing
   8:   return
  
从这个反编译后的解释可以看出,j++是先把j的初始值放入栈中的,而j变量的加之后的值是在堆中的,
在赋值的时候使用加之前的值,所以就是0
     
回复 使用道具 举报
Aron 中级黑马 2014-5-25 22:32:53
17#
学习下 嘿嘿
回复 使用道具 举报
j=j++  运行的先是j,然后再是 ++的,j的初始值是0,所以输出的是0
回复 使用道具 举报
把j定义到i的后面就行了
回复 使用道具 举报
长见识了。。。。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马