黑马程序员技术交流社区

标题: 有没有大牛能解释下a++在参与运算时内存的状态 [打印本页]

作者: 或与非    时间: 2013-12-27 23:48
标题: 有没有大牛能解释下a++在参与运算时内存的状态
例:
int  a=3;
int  b=a++;
b的结果为3
老师讲的是:后++,变量本身先+1,表达式的值为加1前计算的值。
这样能很好的解释结果的由来,但是如果是赋值之前变量就已经+1了,那么名为a的内存空间所存储的数就已经变成了4,那么又是哪里储存的3赋值给了b。
求大牛解释下!

作者: 朱神必    时间: 2013-12-28 00:23
这个你要知道a++和++a的区别,a++是先把a的值提取出来,再++;++a是先++之后再给值。所以其实b=a++可以看成两个式子,即 b=a;a++;
作者: 李程    时间: 2013-12-28 01:37
“但是如果是赋值之前变量就已经+1了,那么名为a的内存空间所存储的数就已经变成了4,那么又是哪里储存的3赋值给了b。”
你这里这个“但是”实在没什么意义,对应的编译规则就是不让它在赋值之前加一。。了解这个规则就可以啦吧,将来犀利了你也可以自己写一个编译器,写成正好和他相反的。。。
作者: FFF    时间: 2013-12-28 09:32
int  b=a++;
Java 里的规则是++最后才运算的。也就是说,先执行把a的值赋予b再执行a的自增。
以下是证明++是最后才执行的代码:
  1.                 int a = 3;
  2.                 int b = a+(a++);
  3.                 System.out.println(b+","+a);
复制代码

以上代码会输出:6,4
也就是说,会先执行3+3,3再自增++

作者: kun1990    时间: 2013-12-28 09:54
a++如果是独立运算的时候跟++a是没有去别的,但是如果是参与了运算,a++表示的是先做了运算,自身再+1,而++a表示的是先+1后,再将a参与运算,你是把这两个给搞混了吧
作者: 松子    时间: 2013-12-28 12:32
如果是b=a++;就是先把a赋值给b,a的值为3,所以b=3;然后,a自增变成4;
如果是b=++a;就是先把a自增变成4,再把自增后的值赋给b,a和b的值都变成4.
就是  前++  和  后++  的区别
作者: 杨丽静    时间: 2013-12-28 15:58
这位同学我感觉是你理解错误,首先int  b=a++;是先把a的值赋值给b,b = 3,然后a再++,a = 4.我是这样理解的
作者: 或与非    时间: 2013-12-28 21:04
qq457986031 发表于 2013-12-28 00:23
这个你要知道a++和++a的区别,a++是先把a的值提取出来,再++;++a是先++之后再给值。所以其实b=a++可以看成 ...

那如果是a=a++呢,结果也是3呀。
作者: 或与非    时间: 2013-12-28 21:09
FFF 发表于 2013-12-28 09:32
int  b=a++;
Java 里的规则是++最后才运算的。也就是说,先执行把a的值赋予b再执行a的自增。
以下是证明++ ...

那如果是a=a++呢,结果也是3呀,是不是a++的值与赋给a的值是存在于两个内存空间里的?
作者: 由然自美    时间: 2013-12-28 21:22

int  b=a++;是先把a的值赋值给b,b = 3之后,然后a再自增,是4,
int b=++a;是先把a的值自增变成4,再把4赋给b,b也成了4
你的概念好像混淆了.
作者: 或与非    时间: 2013-12-29 21:47
今天听了冯佳老湿的课终于弄明白了,a++在参与运算之前要先把a原来的值传递到寄存器里,然后自身再+1,由寄存器传递到需要调用的地方。谢谢各位的答案!
作者: 杨丽静    时间: 2013-12-30 23:42
内存空间没有变化,只是先把a的值赋值给了b,而后a再自增1.所以a = 4,b = 3.




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