黑马程序员技术交流社区

标题: 关于a=a++;的个人终极解释; [打印本页]

作者: halohoop    时间: 2015-7-28 09:12
标题: 关于a=a++;的个人终极解释;
本帖最后由 halohoop 于 2015-7-28 16:06 编辑

首先是论坛里有这道题目,问为何a打印出来不是11:

  1. class Test
  2. {
  3.              public static void main(String[] arges)
  4.              {
  5.                     int a = 10;
  6.                     a=a++
  7.                 System.out.println(a);//问题:为何不是11
  8.          }
  9. }
复制代码
——————————————————————————————
以下指示个人理解的方式,并不是正确答案:
貌似大家都没有说到点子上,其实分解一下就可以理解了:

a=a++;

我们说这句先执行的是赋值动作也就是 :

a=a;

而我们知道使用赋值符号“=”连接的变量和表达式,最终可以被打印出来的,

也就是说可以这样

System.out.println(变量1=表达式2);

而且打印的结果是变量1的值。

那也就是说“a=a”执行完,它就代表一个常量了,


假设原来int a = 10;

那么“a=a”执行完,就相当于剩下“10++”,当然语法上这是不支持的,

但是可以理解为给一个常量10,加1,

然而10加1之后,有没有一个变量去接收它,int b = 10 + 1;

所以“10+1”这一句就等于没用了。

因此最终的a还是10,并没有改变。
——————————————————————————
正解请参照↓↓↓↓:
————————————————————————————
a++可以分解成a=10,a=a+1,这两句语句,在java的底层运行机制中,是从右到左执行的,所以先执行了a=a+1,又执行了a=10,等于说是把10加上一后,又直接把a赋值为10,这才是a++这个语句的执行结果,所以最后输出的是10,11在底层机制里直接被忽略了。  这是老师上课时给的标准答案,关于底层的东西那是搞架构的大神研究的,我们这个水平还远远没有入流呀
感谢“syzc321
————————————————————————————


作者: 野驴少东    时间: 2015-7-28 13:23
不错的哦
作者: 曾云鹏    时间: 2015-7-28 13:53
有点绕啊
作者: 黄新宇    时间: 2015-7-28 14:37
请原谅我越看越不明白了:L
作者: syzc321    时间: 2015-7-28 15:38
a++可以分解成a=10,a=a+1,这两句语句,在java的底层运行机制中,是从右到左执行的,所以先执行了a=a+1,又执行了a=10,等于说是把10加上一后,又直接把a赋值为10,这才是a++这个语句的执行结果,所以最后输出的是10,11在底层机制里直接被忽略了。  这是老师上课时给的标准答案,关于底层的东西那是搞架构的大神研究的,我们这个水平还远远没有入流呀
作者: halohoop    时间: 2015-7-28 15:59
syzc321 发表于 2015-7-28 15:38
a++可以分解成a=10,a=a+1,这两句语句,在java的底层运行机制中,是从右到左执行的,所以先执行了a=a+1,又执 ...

谢谢!
受教了!!!
作者: keviner    时间: 2015-7-28 16:09
你不说,我还真没仔细研究过这个。
作者: 飞飞飞丨    时间: 2015-7-28 16:16
不错,出去装逼用
作者: henghenghalala    时间: 2015-7-28 17:18
老师的答案,解惑了,不错不错。
作者: a12366456    时间: 2015-7-28 17:32
我觉得你想的麻烦了,这是Java基础概念理解的问题,这里不清楚就是不清楚表达式的概念,不清楚表达式的值不等同于表达式里面变量的值。变量和运算符构成表达式,表达式构成语句。每一个表达式都有一个值,这个值由运算符和变量共同决定。a=a++;  这个语句从右到左执行,由两个表达式组成:右自增表达式a++和赋值表达式a=( ),Java规定右自增表达式的值为a增1前的值,左自增表达式的值为a自增1之后的值,然后再执行赋值表达式a就等于10了。
作者: 悲伤丿心    时间: 2015-7-28 17:48
涉及到  出栈 入栈的顺序
作者: fmi110    时间: 2015-7-28 18:22
本帖最后由 fmi110 于 2015-7-28 18:26 编辑

解释的浅显易懂啊
作者: fmi110    时间: 2015-7-28 18:32
网上看到的一个解释大概是这样(印象中)
a++;虚拟机实际运算是 int temp = a; a = a+1;
a=a++;则是 int temp =a ; a = a+1; a= temp
作者: 落叶随尘    时间: 2015-7-28 19:24
有点  迷茫            
作者: 水佳伟    时间: 2015-7-28 19:25
楼主厉害,v587
作者: gaoming971366    时间: 2015-7-28 19:27
学习了,36个赞




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