黑马程序员技术交流社区

标题: java累加问题,a = a++写法不对吗 不累加呢? [打印本页]

作者: 郭孟涛    时间: 2013-6-20 16:46
标题: java累加问题,a = a++写法不对吗 不累加呢?
本帖最后由 Super_Class 于 2013-6-21 00:10 编辑

class LeiJia
{
  public static void main(String[] args)

  {
        int a=5;
        a = a++;
        System.out.println("a="+a);//输出怎么是5呢?a = a++写法不对吗

        
        
  }
}


作者: tpsu88    时间: 2013-6-20 16:57
累加原理:通过变量记录住每次变化的结果。通过循环的形式,进行累加动作。

  1. class Demo7
  2. {
  3.   public static void main(String[] args)

  4.   {
  5.         int a = 5;
  6.         int b = a++;
  7.         System.out.println("a="+a);//输出怎么是5呢?a = a++写法不对吗
  8.       
  9.         for(int i=0; i<10;i++) {
  10.                 a += i;
  11.         }
  12.         System.out.println("累加结果=" + a);        
  13.   }
  14. }
  15. /*a=6
  16. 累加结果=51
  17. */
复制代码

作者: shang1jk    时间: 2013-6-20 17:04
尹桥印 发表于 2013-6-20 16:52
a++本来就是将a自身加1,先把a赋值给等号前面的a,再将本身加1;
如果你写成a = ++a ;
打印结果就是6了,先 ...

" 先把a赋值给等号前面的a,再将本身加1;" --->>这样说的话, a还是要加1的啊,, 怎么输出5.

p.s. 你真叫enjoy?!
作者: 饭后小笼包    时间: 2013-6-20 17:15
shang1jk 发表于 2013-6-20 17:04
" 先把a赋值给等号前面的a,再将本身加1;" --->>这样说的话, a还是要加1的啊,, 怎么输出5.

p.s. 你真 ...

你这么一说  我貌似也有点迷糊了
求大神
作者: mulua    时间: 2013-6-20 17:22
a++是先赋值后自增
++a是先自增后赋值
作者: 王靖远    时间: 2013-6-20 19:11
尹桥印 发表于 2013-6-20 17:21
a = a++;
如果写成如下:
int b  = 0;

这也说明不了问题啊。这还是现象啊。搞不清自增到底是怎么完成的
作者: 8047107    时间: 2013-6-20 19:16
a=a++
先赋值再自增
a=++a;
先自增再赋值
作者: 王靖远    时间: 2013-6-20 19:38

同理可以画出 a = ++5;


作者: 袁梦希    时间: 2013-6-20 19:44
加油楼主
作者: 陈鹏    时间: 2013-6-20 20:03
int a=5;
        a = a++;//先赋值再自增,而a=++a,就是先自增,后赋值
        System.out.println("a="+a);//所以这儿是5
作者: hx32    时间: 2013-6-20 20:05
王靖远 发表于 2013-6-20 19:38
同理可以画出 a = ++5;
  1. class LeiJia
  2. {
  3. public static void main(String[] args)

  4. {
  5. int a=5;
  6. a = a++;
  7. System.out.println("a="+a);//输出怎么是5呢?a = a++写法不对吗
  8. System.out.println("a="+a);//输出仍然是a=5


  9. }
  10. }
复制代码
看了图解,我了解了累加的实现,然后我就想,再输出一次a值是否可以实现a=6,但是仍然是5.怎样可以输出a=6呢?(我知道++5的实现)有时间解答的话非常感谢

作者: hx32    时间: 2013-6-20 20:11
尹桥印 发表于 2013-6-20 17:21
a = a++;
如果写成如下:
int b  = 0;

a=b的话输出仍然是5,直接输出a就是6.层主忽略了
作者: 王靖远    时间: 2013-6-20 20:13
hx32 发表于 2013-6-20 20:05
看了图解,我了解了累加的实现,然后我就想,再输出一次a值是否可以实现a=6,但是仍然是5.怎样可以输出a= ...

因为a = a++;是左边自增运算完再赋值的,当赋值的时候,右边运算开辟的栈内存都释放了,a还是等于5。 你要想要a = 6,那就不要将a++赋给a就行了,因为没有了第二步的覆盖操作。
作者: hx32    时间: 2013-6-20 20:13
尹桥印 发表于 2013-6-20 17:21
a = a++;
如果写成如下:
int b  = 0;

第一次回复理解错了,原来层主的代码是解释了为什么输出是a=5.大意了
作者: hx32    时间: 2013-6-20 20:14
王靖远 发表于 2013-6-20 20:13
因为a = a++;是左边自增运算完再赋值的,当赋值的时候,右边运算开辟的栈内存都释放了,a还是等于5。 你 ...

哦,是栈内存释放的原因,明白了,谢谢
作者: sunriselzz    时间: 2013-6-20 21:08
a = a++这个写法没有错误的,++在后,先把a之前初始化的值5赋值给左边的a,先打印输出a的值5,然后再自加+1,也就是在+1前就已经打印输出ar的值了.故输出的结果是5,而表达式本身没有错误.
作者: 神之梦    时间: 2013-6-20 22:01
hx32 发表于 2013-6-20 20:14
哦,是栈内存释放的原因,明白了,谢谢

额  ,差点把楼主给看错了
作者: 王靖远    时间: 2013-6-21 09:51
sunriselzz 发表于 2013-6-20 21:08
a = a++这个写法没有错误的,++在后,先把a之前初始化的值5赋值给左边的a,先打印输出a的值5,然后再自加+1,也 ...

应该是a先自增为6,然后被覆盖了的过程,
作者: 以防万一    时间: 2013-6-21 21:42
尹桥印 发表于 2013-6-20 17:17
这题还得细细思考

a=a++
这时候前面的a表示的是另一个变量
然后因为加号在后边,语句会先把后边的a赋值给前边的a,之后再执行+1......

大概意思就是这个吧{:2_32:}

作者: ⋛⋌⋚JEEP    时间: 2014-7-14 23:32
这个a的问题,为了方便记忆,这样理解吧。a=a++;//两个a很靠近,可以理解成右边的a先赋值给左边的a再自增;a=++a;//两个a离的较远,理解成右边的a先自增再赋值给左边的a。写代码的时候,如果容易出错,还是写成"a++;"或者"++a"都可以{:3_57:}
作者: 张周飞    时间: 2014-7-15 10:38

楼主的问题很好,也同时解决了我还不懂的问题
受益匪浅,
作者: a191170796    时间: 2014-7-16 11:00
顺序问题吧!!!
作者: 钟翠翠    时间: 2014-7-17 09:04
a=a++,试讲a值赋给a,再进行自增;a=++a,是将a自增,得到a+1,再赋给a。

作者: nxp1986    时间: 2014-7-18 14:12
这个必须是累加的顺序不同而导致结果不同啊
作者: liujingnan    时间: 2014-7-20 13:07
先把a赋值给等号前面的a,再将本身加1;" --->>这样说的话, a还是要加1的啊,, 怎么输出5.
作者: 刘斌2014    时间: 2014-7-26 13:12
楼下的分析都很详细 看懂了




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