黑马程序员技术交流社区

标题: 简单的问题? [打印本页]

作者: 湛添友    时间: 2014-5-25 09:45
标题: 简单的问题?
  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了吗?
作者: jiang_ming    时间: 2014-5-25 09:54
j++就是先返回j的值,然后j再加一,下一次就返回j+1,
作者: EDDY_Liang    时间: 2014-5-25 10:16
j++本来就是一个赋值运算符里的自增,
意思就是每一次读这句语句时j加1然后赋值给新的j
所以j++就等同于(可以用==表示)j=j+1
作者: 湛添友    时间: 2014-5-25 10:26
EDDY_Liang 发表于 2014-5-25 10:16
j++本来就是一个赋值运算符里的自增,
意思就是每一次读这句语句时j加1然后赋值给新的j
所以j++就等同于( ...

nono 不是哦
作者: youcyou    时间: 2014-5-25 10:49
J++是先用后运算
作者: pyboy    时间: 2014-5-25 11:28
你的for循环中执行相当于:
j=j;
j=j+1;
作者: 247033993@qq.co    时间: 2014-5-25 11:29
你把j=去掉吧
作者: 247033993@qq.co    时间: 2014-5-25 11:31
或者你j=++j,这是++j和j++的本质区别,细心点就好了
作者: wojiaojay    时间: 2014-5-25 13:13
你要理解j++和++j的区别,j++是先赋值再自增,++j是先自增,再赋值!!!
作者: 张志民    时间: 2014-5-25 13:33
要到下一次 j才是j+1
作者: ZHao.Xiao    时间: 2014-5-25 16:10
j=j++没必要这样写,j++是先赋值再自增1,++j,就自增1再赋值
作者: 李小石    时间: 2014-5-25 19:20
很幸运我看到了这个问题,谢谢楼主啦。
谷歌了下,http://www.oschina.net/question/12_8120 这是问题的解答
作者: 七弦    时间: 2014-5-25 19:37
   j++ 就相当于 j = j + 1;

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

这是很疯狂的事!
作者: stream    时间: 2014-5-25 20:47
j=j++????这么奇葩的语句
作者: 西门吹风    时间: 2014-5-25 22:23
本帖最后由 西门吹风 于 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,希望已经足够清楚


作者: 向前看向前走    时间: 2014-5-25 22:27
看了楼主的提问,以楼上的问题,感觉都不对呀,自己也查了一些资料,试验了一下,按照楼上的说法,可以解释是这样          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
学习下 嘿嘿
作者: 黑马粉、峥    时间: 2014-5-25 22:33
j=j++  运行的先是j,然后再是 ++的,j的初始值是0,所以输出的是0
作者: 黄河一抔泥    时间: 2014-5-26 17:25
把j定义到i的后面就行了
作者: leo_lzj    时间: 2014-5-26 20:50
长见识了。。。。
作者: yinxjfly    时间: 2014-5-27 11:46
++在变量名后面是先参与运算,后自增,
++在变量名前面是先自增,后参与运算!
作者: pk49800    时间: 2014-5-27 20:47
j++是先賦值后運算(自加),++j則是先運算(自加)后賦值
作者: 小钟    时间: 2014-5-28 01:06
这种问题还真没试过,刚试了试。输出0,真是长见识了!

作者: java木    时间: 2014-5-28 05:02
我怎么看不到问题?
b=++a 是a先在家吃饭然后出去玩
b=a++是a先出去玩,在回家吃饭




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