黑马程序员技术交流社区

标题: java和c++中的后++有点不同 [打印本页]

作者: chulangren2    时间: 2014-7-13 23:51
标题: java和c++中的后++有点不同
int  a=0;
a=a++;
请问a=?
答案是C++中 a=1; java中a=0;  这是什么原因,java中为什么会出现这种情况。


作者: java—family    时间: 2014-7-13 23:59
java中 a=a++,他是先将“=”右边的a给左边的a     在做++运算            
作者: java—family    时间: 2014-7-14 00:00
a=++a就是1了   这个先加了  在复给左边
作者: EarlyHeart    时间: 2014-7-14 00:09
a++的运算规则:
1.先把a的值“赋”给"a++"这个表达式。
2.然后a再自加1。

作者: chulangren2    时间: 2014-7-15 09:54
java—family 发表于 2014-7-13 23:59
java中 a=a++,他是先将“=”右边的a给左边的a     在做++运算

a做++运算后不是1吗,为什么还是0?
作者: chulangren2    时间: 2014-7-15 09:56
EarlyHeart 发表于 2014-7-14 00:09
a++的运算规则:
1.先把a的值“赋”给"a++"这个表达式。
2.然后a再自加1。

那a的值也是1啊不是应该是0
作者: hejinzhong    时间: 2014-7-15 10:04
这两个i不是同一个内存中的i,当等号两边变量同名的时候,运算 i=i++这么理解 j=i++,i=j 。这个语言设计时候的一些细节问题,可以查看java中++的实现详细过程。
作者: 毕业生    时间: 2014-7-15 10:38
a= a++;
先取值再自增,这个先取值其实是先把值暂存在一个临时变量中,整个过程可以理解为:
temp = a; a= a+1; a= temp;
因为a初始值是0,所以temp的值是0,最终a的取值也是0。
作者: fantacyleo    时间: 2014-7-15 10:39
本帖最后由 fantacyleo 于 2014-7-15 10:49 编辑

你的c++编译器是哪个,vc++还是g++?我用g++编译出来是a=0。在c++中,a=a++这种表达式的语义是未定义的,编译器怎么高兴怎么来。之所以有的c++编译器会出现a=1,是因为a++的运算过程被打断,拆分成了求a++的值和a的值+1:先把a++的值赋值给a(此时为0),然后再把a++对a的+1效果放入内存中(此时a=1)。Java中不允许这种模糊性,a++的运算过程不允许出现这种中断,=右边的表达式计算过程必须全部完成才赋值给左边。java语言规范是这么说的:V is definitely assigned after ++a , --a , a++ , or a-- iff either a is V or V is definitely assigned after the operand expression


作者: chulangren2    时间: 2014-7-15 11:41
毕业生 发表于 2014-7-15 10:38
a= a++;
先取值再自增,这个先取值其实是先把值暂存在一个临时变量中,整个过程可以理解为:
temp = a; a=  ...

听着好像是正确的,谢了。。
作者: EarlyHeart    时间: 2014-7-15 11:44
chulangren2 发表于 2014-7-15 09:54
a做++运算后不是1吗,为什么还是0?

因为你这句话a=a++;又把a++的值(0)赋给a了。
作者: EarlyHeart    时间: 2014-7-15 11:47
chulangren2 发表于 2014-7-15 09:56
那a的值也是1啊不是应该是0

因为你这句话a=a++;又把a++的值(0)赋给a了。
a++这个表达式的值是0,但a的值是1,但是你把a++这个表达式的值赋给a,也就是把a(1)的值覆盖了,所以a又成了0了。
作者: 吾凡庸    时间: 2014-7-15 11:54
可以参照 自增后:
a=2; b=a++;
a=3; b=2;





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