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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© halohoop 中级黑马   /  2015-7-28 09:12  /  1301 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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
————————————————————————————

15 个回复

倒序浏览
不错的哦
回复 使用道具 举报
有点绕啊
回复 使用道具 举报
请原谅我越看越不明白了:L
回复 使用道具 举报
syzc321 来自手机 初级黑马 2015-7-28 15:38:12
报纸
a++可以分解成a=10,a=a+1,这两句语句,在java的底层运行机制中,是从右到左执行的,所以先执行了a=a+1,又执行了a=10,等于说是把10加上一后,又直接把a赋值为10,这才是a++这个语句的执行结果,所以最后输出的是10,11在底层机制里直接被忽略了。  这是老师上课时给的标准答案,关于底层的东西那是搞架构的大神研究的,我们这个水平还远远没有入流呀
回复 使用道具 举报
syzc321 发表于 2015-7-28 15:38
a++可以分解成a=10,a=a+1,这两句语句,在java的底层运行机制中,是从右到左执行的,所以先执行了a=a+1,又执 ...

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

解释的浅显易懂啊
回复 使用道具 举报
网上看到的一个解释大概是这样(印象中)
a++;虚拟机实际运算是 int temp = a; a = a+1;
a=a++;则是 int temp =a ; a = a+1; a= temp
回复 使用道具 举报
有点  迷茫            
回复 使用道具 举报
楼主厉害,v587
回复 使用道具 举报
学习了,36个赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马