java 中a=a++ 的问题

rinimalegebi123 2014-03-24 11:33:39
java中
int a=3;
a=a++输出a的值为3
而在C中执行同样的语句输出为4

java中
int a=3;
a+=a++
输出为6
C中输出为7

a+=++a
java中输出7
C输出8
求大神给解释一下啊
...全文
4208 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
田埂上的梦i 2014-07-05
  • 打赏
  • 举报
回复
猜想:c不分先后++,只要有++就会加值,再赋值。而java分先++和后++,先++是自增后再赋值。后++是先赋值再自增。
小灰狼 2014-07-04
  • 打赏
  • 举报
回复
看到标题,忍不住进来看一下 这类问题在CSDN的论坛里,每过一阵子都会有人帖一下 我只想说,研究这个有意义吗 这种问题,也就那些高校的老师们喜欢在考试的时候拿来显摆一下他们对某一语言的熟练程度而已,除此之外没有任何意义
kiyoki 2014-07-03
  • 打赏
  • 举报
回复
引用 26 楼 rinimalegebi123 的回复:
[quote=引用 17 楼 u013045639 的回复:] 不推荐用这种写法,可读性差
是啊,平时写肯定自己写清楚,这是操蛋的公司笔试题啊。。。。[/quote] 读完21楼的文章后,我感觉这问题一点也不操蛋
kiyoki 2014-07-03
  • 打赏
  • 举报
回复 1
用编译出来的字节码
引用 20 楼 wangxf_8341 的回复:
这个问题反编译一下就能明白 int a=3; a+=++a; 反编译如下: 而int a=3; a+=a++; 反编译如下: 仔细比较一下就明白了,如果看不懂就去查一下虚拟机的指令
这种依靠反编译明白的方式,其实和运行一下根据结果倒推一样 都是以“标准答案”为出发点,而不是从问题切入 仅从编译结果去理解,碰上不同编译器有不同编译方式时必定中招 我觉得应该从jls定义的语义出发更合理,所以21楼的文章真是非常有意义 最主要里面声明了最重要的一句:java肯定是从左到右的 那么根绝这个原则,a += ++a之前 那么开始的a就肯定是3了,因为从左到右
0xiaoxin 2014-07-02
  • 打赏
  • 举报
回复
新手来学习下。
Gansuper7012 2014-07-02
  • 打赏
  • 举报
回复
优先级问题啊 !
只是_曾经 2014-06-27
  • 打赏
  • 举报
回复
正解
引用 4 楼 huxiweng 的回复:
++a 和 a++ int a = 3; a+=a++ => 先算a+=a此时为6,a再自增 a+=++a =>先是右边a自增(a为4),再计算a+=
zf12102926 2014-06-27
  • 打赏
  • 举报
回复
C和JAVA的某些机制是不一样的,楼主不用纠结,我只有在大学的考试中见过你这样的写法,在工作中是不会出现这样可读性差的代码的。
yuhouqingchen_2648 2014-06-23
  • 打赏
  • 举报
回复
引用 32 楼 li33653771 的回复:
对于a = a++,大家都知道,a++参与运算的话,是a先参与运算,再执行a自增操作。但这里尴尬的是,++的优先级是高于=的,因此,java的处理方法是,会在内存里先开辟一个临时空间,存放a的值,然后a自增,之后再从临时空间拿出来a,赋给a。很明显c是没有这个机制的
意思正确,这个基于的是jvm的字节码
yukirin91 2014-03-26
  • 打赏
  • 举报
回复
对于a = a++,大家都知道,a++参与运算的话,是a先参与运算,再执行a自增操作。但这里尴尬的是,++的优先级是高于=的,因此,java的处理方法是,会在内存里先开辟一个临时空间,存放a的值,然后a自增,之后再从临时空间拿出来a,赋给a。很明显c是没有这个机制的
lliiqiang 2014-03-26
  • 打赏
  • 举报
回复
a=a++ a++取出3,a加1变成4,然后把原来获得的3赋给a C语言中的++是指整个语句执行完以后再加吗?
明日天涯yang 2014-03-25
  • 打赏
  • 举报
回复
引用 17 楼 u013045639 的回复:
不推荐用这种写法,可读性差
是啊,平时写肯定自己写清楚,这是操蛋的公司笔试题啊。。。。
wozuiqiangdeaoyi 2014-03-25
  • 打赏
  • 举报
回复
楼上除了21楼其他全是错的 ++运算符的结果取决于编译器而不是语言定义的规则, x = y++ + z++; 这句在vc和gcc中的结果不一样 但是在java中大多数是一致的,因为java的编译器通常不是sun的就是ibm的
放纵的青春 2014-03-25
  • 打赏
  • 举报
回复
2个语言的规则不一样 所以结果不一样 至于规则为什么不一样 哪里有这么多为什么···
天潺 2014-03-25
  • 打赏
  • 举报
回复
恩,完全不建议这样写,把代码搞的很绕。直观简单才好
跳动de指尖 2014-03-25
  • 打赏
  • 举报
回复
优先级的问题,语言不通,优先级也不通罢。 i++,用完再+1,++i 反之
淡定的峰哥 2014-03-25
  • 打赏
  • 举报
回复
引用 20 楼 wangxf_8341 的回复:
这个问题反编译一下就能明白 int a=3; a+=++a; 反编译如下: 而int a=3; a+=a++; 反编译如下: 仔细比较一下就明白了,如果看不懂就去查一下虚拟机的指令
用gui反编译之后代码 int a=3; a+=++a; 变成了

int i = 3;
    i = i++ + i;
霜之哀伤 2014-03-25
  • 打赏
  • 举报
回复
这问题和回字有几种写法有异曲同工之妙啊
挨踢直男 2014-03-25
  • 打赏
  • 举报
回复
弄这么复杂干嘛呢, 看起来都累
加载更多回复(22)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧