黑马程序员技术交流社区

标题: 关于int a =1,a=a++ ,打印a的结果的问题,能解释下吗 [打印本页]

作者: 怀瑾    时间: 2015-11-12 23:07
标题: 关于int a =1,a=a++ ,打印a的结果的问题,能解释下吗
关于int a =1,a=a++ ,打印a的结果的问题,能解释下吗
作者: wwwgaoxi    时间: 2015-11-12 23:13
这是个强大的问题,正在思考中~~
作者: candlelight    时间: 2015-11-12 23:34
执行a=a++的时候,计算机底层是这样a=a(a当时等于1);a=a+1,计算机底层是从右往左开始计算的,a=a+1后的a=2,然后运算左边的a=1,所有打印出来的是1
作者: 一个人走天下    时间: 2015-11-12 23:46


a先做的赋值,相当于a给了a,而i初始化的时候是1,所以没什么意义.
如果你++a结果就会不一样.++a会先做自增,再去赋值.

作者: 北极瞭望塔    时间: 2015-11-13 00:21
这里要明白a++和++a的用法。a++和++a如果不参与运算单独使用,效果一样,都是自身加一。
作者: 北极瞭望塔    时间: 2015-11-13 00:24
标题: RE: 关于int a =1,a=a++ ,打印a的结果的问题,能解释下吗
北极瞭望塔 发表于 2015-11-13 00:21
这里要明白a++和++a的用法。a++和++a如果不参与运算单独使用,效果一样,都是自身加一。 ...

2:参与运算时,a++先运算(a先参加运算)然后自身加一,而++a (a先自身加一)先自身加一,在参与运算
作者: lovetonia    时间: 2015-11-13 04:02
先赋值,再自增
作者: xiao15779706    时间: 2015-11-13 08:46
打印结果是啥?
作者: Phy_zhang    时间: 2015-11-13 17:46
看了最新的帖子,触感而发,其实a=a++可以拆分为 tmp=a ; a=a+1 ; a = tmp 其实就是什么都没发生过!!! 所以a还是原来的1
作者: yubail    时间: 2015-11-13 19:34
楼上正解
作者: keaitao0321    时间: 2015-11-13 20:36
定义了一个int类型的变量a,然后a自增一次(也就是加1),此时a的值变成了2,然后将=号右边的2赋值给了=号左边的a,所以打印a的结果是2
作者: 年輕    时间: 2015-11-13 21:24
a++先运算 再自增
作者: 沈会来    时间: 2015-11-13 21:24
看到大家的回帖我也是醉了
作者: 沈会来    时间: 2015-11-13 21:29
你的题意结果a=1,已经验证,但是,如果你是b=a++的话,结果就不一样了,结果b=1,a=2其中的关键你要思考,不太好讲,只能说是还没有赋值
作者: 怀瑾    时间: 2015-11-13 21:43
candlelight 发表于 2015-11-12 23:34
执行a=a++的时候,计算机底层是这样a=a(a当时等于1);a=a+1,计算机底层是从右往左开始计算的,a=a+1后的a=2, ...

老师是这么讲的
作者: 怀瑾    时间: 2015-11-13 21:44
沈会来 发表于 2015-11-13 21:29
你的题意结果a=1,已经验证,但是,如果你是b=a++的话,结果就不一样了,结果b=1,a=2其中的关键你要思考, ...

现在知道了,这个确实不好说清楚
作者: 海贼    时间: 2015-11-13 21:49
输出1。  a=a++;可以理解成a=1,a=a+1, 因为底层代码是从右往左执行的,所以输出1.
作者: 怀瑾    时间: 2015-11-13 21:49
keaitao0321 发表于 2015-11-13 20:36
定义了一个int类型的变量a,然后a自增一次(也就是加1),此时a的值变成了2,然后将=号右边的2赋值给了=号 ...

不是这样的,打印的结果是1
作者: 怀瑾    时间: 2015-11-13 21:57
xiao15779706 发表于 2015-11-13 08:46
打印结果是啥?

结果是1,下面有正解
作者: 怀瑾    时间: 2015-11-13 22:02
一个人走天下 发表于 2015-11-12 23:46
a先做的赋值,相当于a给了a,而i初始化的时候是1,所以没什么意义.
如果你++a结果就会不一样.++a会先做自增, ...

我觉得有三种解释都是有道理
作者: 海狮    时间: 2015-11-13 22:03
Phy_zhang 发表于 2015-11-13 17:46
看了最新的帖子,触感而发,其实a=a++可以拆分为 tmp=a ; a=a+1 ; a = tmp 其实就是什么都没发生过!!! 所以a ...

这个正解
a=a++
后面的a先赋值给一个临时常量,
然后自增
然后把临时常量赋值给a
作者: 怀瑾    时间: 2015-11-13 22:05
wwwgaoxi 发表于 2015-11-12 23:13
这是个强大的问题,正在思考中~~

大神请指点
作者: keaitao0321    时间: 2015-11-13 22:10
怀瑾 发表于 2015-11-13 21:49
不是这样的,打印的结果是1

谢谢提醒,是赋值再自增,确实是1
作者: 小笨笨天    时间: 2015-11-13 22:35
沈会来 发表于 2015-11-13 21:29
你的题意结果a=1,已经验证,但是,如果你是b=a++的话,结果就不一样了,结果b=1,a=2其中的关键你要思考, ...

大神求指教   确实  如果改为 b=a++   则a=2,这样证明在b被赋值后 a自加了    同理   a=a++  为什么就不能先赋值后自加?  a=a++ 底层到底怎么运行的啊?  改为 a=++a; 这样还是好理解,先加在赋值给本身  
作者: qiluzhixing    时间: 2015-11-13 22:42
打印a=1把
作者: jia7604112    时间: 2015-11-13 22:52
打印结果居然是1,一直以为是2

作者: 木子子木    时间: 2015-11-13 22:56
a++相当于两条语句:a=a;a=a+1;所以结果是1;
作者: HI耀玮    时间: 2015-11-13 22:58
哪位大神知道
作者: 你是对的    时间: 2015-11-14 10:04
哈哈昨天也有人问这个
作者: +icer+    时间: 2015-11-14 10:51
你可以看成 a = 1;b = a++; a = b;这样就好理解了
作者: wwwgaoxi    时间: 2015-11-14 13:49
这是底部的隐形转换啊,因为在底部计算机是从右往左算的啊,
作者: 你知道我的迷惘    时间: 2015-11-14 17:31
为什么我觉得都是大神{:2_33:}
作者: fsociety    时间: 2015-11-14 18:20
结果是1
a = a ++
这里是a 先把 1赋值给了a  然后才++ 的
作者: syb012    时间: 2015-11-14 20:48
因为a++中a在自增之前会先把原来的值放入一个临时变量里,然后a自增,然后用那个临时变量参与运算。

看起来就像a后增一样。一般情况下的效果的确是a后赠。

但事实是a先增,然后用自增前的那个存在临时变量的数值参与运算。

那么
int a=1;
a=a++;
这两句话可以拆解成下面的语句:
int a=1;

int temp=a;  //这中间两句其实就是a++的过程
a=a+1;

a=temp;  //从这到上三句其实就是 a=a++;的过程
作者: JYcainiao    时间: 2015-11-14 21:55
a++ 表达式结果为1   a为2   最后a++表达式的值又赋值给a  所以a的值最后为1   你可以单独打印啊  打印个a++  然后打印个a  就知道了
作者: 不带走一片唇印    时间: 2015-11-14 22:05
只是给a做了重新赋值
作者: 梭梭树    时间: 2015-11-14 23:34
我觉得,学到后面没人会这样写代码了,太无聊
作者: 臭小子    时间: 2015-11-15 10:58
其实可以这么记,++在变量前面就先自增然后再赋值,如果++在变量后面就先赋值,再自增。
作者: wx_ao22R6RC    时间: 2015-11-15 11:00
前++是先++在运算,后++是先运算后++;所以a=a++;就把a给了a没变。
作者: dsap    时间: 2015-11-15 12:19
从右往左运行是怎么运行的?
作者: 田浩然    时间: 2015-11-15 20:20

同样求解,求哪位大神来分享一下
作者: 月夜飘星    时间: 2015-11-16 20:26
a++先运算后自增,运算过程 (1)b = a,此时b = 1;(2)a = a + 1;此时a = 2,

代码.png (9.6 KB, 下载次数: 21)

代码.png

结果.png (1.65 KB, 下载次数: 19)

结果.png

作者: 何必ˇㄨ那么假    时间: 2016-3-16 23:33
打印的是 1  执行完成后才变成 2;  如果是前缀 打印的就是 2;  我是来刷分的~~~~
作者: tangshenshen    时间: 2016-3-17 14:29
受教了。。。。。。。。。
作者: yunfeng482    时间: 2016-3-17 15:00
受教了!{:2_36:}




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