黑马程序员技术交流社区
标题: 关于a=a++;的个人终极解释; [打印本页]
作者: halohoop 时间: 2015-7-28 09:12
标题: 关于a=a++;的个人终极解释;
本帖最后由 halohoop 于 2015-7-28 16:06 编辑
首先是论坛里有这道题目,问为何a打印出来不是11:
- class Test
- {
- public static void main(String[] arges)
- {
- int a = 10;
- a=a++
- System.out.println(a);//问题:为何不是11
- }
- }
复制代码 ——————————————————————————————
以下指示个人理解的方式,并不是正确答案:
貌似大家都没有说到点子上,其实分解一下就可以理解了:
a=a++;
我们说这句先执行的是赋值动作也就是 :
a=a;
而我们知道使用赋值符号“=”连接的变量和表达式,最终可以被打印出来的,
也就是说可以这样
System.out.println(变量1=表达式2);
而且打印的结果是变量1的值。
那么“a=a”执行完,就相当于剩下“10++”,当然语法上这是不支持的,
然而10加1之后,有没有一个变量去接收它,int b = 10 + 1;
——————————————————————————
正解请参照↓↓↓↓:
————————————————————————————
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
谢谢!
受教了!!!
作者: 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 |