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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chulangren2 中级黑马   /  2014-7-13 23:51  /  1485 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int  a=0;
a=a++;
请问a=?
答案是C++中 a=1; java中a=0;  这是什么原因,java中为什么会出现这种情况。

12 个回复

倒序浏览
java中 a=a++,他是先将“=”右边的a给左边的a     在做++运算            
回复 使用道具 举报
a=++a就是1了   这个先加了  在复给左边
回复 使用道具 举报
a++的运算规则:
1.先把a的值“赋”给"a++"这个表达式。
2.然后a再自加1。
回复 使用道具 举报
java—family 发表于 2014-7-13 23:59
java中 a=a++,他是先将“=”右边的a给左边的a     在做++运算

a做++运算后不是1吗,为什么还是0?
回复 使用道具 举报
EarlyHeart 发表于 2014-7-14 00:09
a++的运算规则:
1.先把a的值“赋”给"a++"这个表达式。
2.然后a再自加1。

那a的值也是1啊不是应该是0
回复 使用道具 举报
这两个i不是同一个内存中的i,当等号两边变量同名的时候,运算 i=i++这么理解 j=i++,i=j 。这个语言设计时候的一些细节问题,可以查看java中++的实现详细过程。
回复 使用道具 举报
a= a++;
先取值再自增,这个先取值其实是先把值暂存在一个临时变量中,整个过程可以理解为:
temp = a; a= a+1; a= temp;
因为a初始值是0,所以temp的值是0,最终a的取值也是0。
回复 使用道具 举报
本帖最后由 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

回复 使用道具 举报
毕业生 发表于 2014-7-15 10:38
a= a++;
先取值再自增,这个先取值其实是先把值暂存在一个临时变量中,整个过程可以理解为:
temp = a; a=  ...

听着好像是正确的,谢了。。
回复 使用道具 举报
chulangren2 发表于 2014-7-15 09:54
a做++运算后不是1吗,为什么还是0?

因为你这句话a=a++;又把a++的值(0)赋给a了。
回复 使用道具 举报
chulangren2 发表于 2014-7-15 09:56
那a的值也是1啊不是应该是0

因为你这句话a=a++;又把a++的值(0)赋给a了。
a++这个表达式的值是0,但a的值是1,但是你把a++这个表达式的值赋给a,也就是把a(1)的值覆盖了,所以a又成了0了。
回复 使用道具 举报
可以参照 自增后:
a=2; b=a++;
a=3; b=2;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马