黑马程序员技术交流社区

标题: 关于a++和++a的问题 [打印本页]

作者: 飞翔的猪    时间: 2015-5-9 15:16
标题: 关于a++和++a的问题
今天看了李明杰老师的视频,做了做实验,发现一个问题求大神指导。
int a=10;

int b=(++a)+(a++);
运行结果是b=23。。。我想知道怎么回事
作者: wangsong    时间: 2015-5-9 16:37
++a后的a的结果是11,a++是在11的基础上加1,也就是12。11+12=23
作者: wangsong    时间: 2015-5-9 16:45
这里是我在网上找的,关于++a和a++解释的挺好:
作者: wangsong    时间: 2015-5-9 16:48
你可以这样来想:++a和a++,都是个表达式,最后的结果就取决于是先加,还是后加,如果是先加,那么最后的表达式的结果就是a的值加1,如果是后加的话,则表达式的值就是原来a的值;而无论是先加,还是后加,a的值计算后一定会加1。 比如: 如果a=1,b=a++,运算完b=1,a=2 如果a=1,b=++a,运算完b=2,a=2  当然也可以这么理解: a++就是a=a+1,其含义就是现将后面的a赋值给前面的a然后再加1. ++a就是a=1+a,其含义就是先对后面的a加1然后再赋值给前面的1. 但这只是在表达式中. 如果在单独的语句中二者都没有什么区别! 列:int a=1,b=1; a++;++b;//这里就是语句! printf("%d%d",a,b); 输出都是2. 而表达式则是if((a++)==1)和if((++a)==1)这里就有区别了!
作者: wzboy    时间: 2015-5-9 16:53
b = 22 哪来的23? 视频上讲的很清楚噻
作者: 飞翔的猪    时间: 2015-5-9 16:54
wangsong 发表于 2015-5-9 16:48
你可以这样来想:++a和a++,都是个表达式,最后的结果就取决于是先加,还是后加,如果是先加,那么最后的表 ...

结果不对把  ,b=(++a)+(a++)  (++a) 是11  (a++) 取值为11  之后a为12 ,按照视频上的结果该为22,凌乱了。。
作者: 飞翔的猪    时间: 2015-5-9 16:56
wzboy 发表于 2015-5-9 16:53
b = 22 哪来的23? 视频上讲的很清楚噻

运行结果就是23。。。我也不知道怎么回事
作者: roblonely    时间: 2015-5-9 16:58
应该是22
作者: wzboy    时间: 2015-5-9 16:59
本帖最后由 wzboy 于 2015-5-9 17:00 编辑
飞翔的猪 发表于 2015-5-9 16:54
结果不对把  ,b=(++a)+(a++)  (++a) 是11  (a++) 取值为11  之后a为12 ,按照视频上的结果该为22, ...

结果就是22啊 你敲代码了没?把你的运行结果截个图看看
作者: 飞翔的猪    时间: 2015-5-9 17:04
这是运行结果 用的是DEV C++编译器

QQ截图20150509170205.png (10.05 KB, 下载次数: 29)

QQ截图20150509170205.png

作者: 飞翔的猪    时间: 2015-5-9 17:05
wzboy 发表于 2015-5-9 16:59
结果就是22啊 你敲代码了没?把你的运行结果截个图看看

这是结果

QQ截图20150509170205.png (10.05 KB, 下载次数: 35)

QQ截图20150509170205.png

作者: wzboy    时间: 2015-5-9 17:07
飞翔的猪 发表于 2015-5-9 17:04
这是运行结果 用的是DEV C++编译器

代码就是你刚才帖子上的?我用c-Free 和 Xcode 都是22 老师讲的也是22
你再换个编译器试试
作者: 飞翔的猪    时间: 2015-5-9 17:09
wzboy 发表于 2015-5-9 17:07
代码就是你刚才帖子上的?我用c-Free 和 Xcode 都是22 老师讲的也是22
你再换个编译器试试  ...

嗯嗯,我试试在linux下用gcc试试 可能就是编译器的问题
作者: 飞翔的猪    时间: 2015-5-9 17:14
wzboy 发表于 2015-5-9 17:07
代码就是你刚才帖子上的?我用c-Free 和 Xcode 都是22 老师讲的也是22
你再换个编译器试试  ...

的确是22 ,看来不能用这个编译器了,还是用gcc吧,真伤人
作者: wangsong    时间: 2015-5-9 20:03
飞翔的猪 发表于 2015-5-9 16:54
结果不对把  ,b=(++a)+(a++)  (++a) 是11  (a++) 取值为11  之后a为12 ,按照视频上的结果该为22, ...

你把括号去了再试试,这里面有优先级的问题
作者: wr6524798    时间: 2015-5-9 20:31
a++就是先运算然后再a+1;++a就是先a=a+1,然后再进行运算
int a=10;
int b=(++a)+(a++);
就是++a使a=11,然后a++   a还是11  b = 11+11 =22  答案应该是22不是23
作者:   张恒宇    时间: 2015-5-9 21:41
结果是22.。。。你的源代码是什么
作者: xiaofei93    时间: 2015-5-10 07:53
int b=(++a)+(a++); = 11+11 = 22 ,++a之后括号内是11,a也是11;有a++的地方可以把a++直接换成a的值,因为a++是先做运算后++,但是a的值会变成相应的12。所以不管是a++还是++a,a的值都+1,不同的是组合起来的结果不一样参与++a整体的值会比之前大1,a++的值和a的值一样,但是前提要弄明白a的值到底是几。
作者: wangzhewjl    时间: 2015-5-10 08:23
本帖最后由 wangzhewjl 于 2015-5-10 08:25 编辑

你都用括号括起来了。括号优先 先把括号里面算完再进行加法;int b=(++a)+(a++);第一步先算(++a) 结果是11,此时a==11,再算(a++),(a++)的结果是12,最后11+12 ==23
PS:你把两个括号去掉结果是22  最后不同的编译器结果也不同哦!


作者: 飞翔的猪    时间: 2015-5-10 10:00
wr6524798 发表于 2015-5-9 20:31
a++就是先运算然后再a+1;++a就是先a=a+1,然后再进行运算
int a=10;
int b=(++a)+(a++);

用dev c++编译器(windows下)编译的是23 ,用linux下gcc 编译的是22 ,编译器的问题,正确的应该是22
作者: 飞翔的猪    时间: 2015-5-10 10:02
wangzhewjl 发表于 2015-5-10 08:23
你都用括号括起来了。括号优先 先把括号里面算完再进行加法;int b=(++a)+(a++);第一步先算(++a) 结果是 ...

嗯嗯,的确,不同的编译器是不同的,我还是相信gcc 和mj老师嘿嘿
作者: 飞翔的猪    时间: 2015-5-10 10:03
xiaofei93 发表于 2015-5-10 07:53
int b=(++a)+(a++); = 11+11 = 22 ,++a之后括号内是11,a也是11;有a++的地方可以把a++直接换成a的值,因 ...

嗯嗯,我明白这个的原理,只是被编译器给忽悠了,谢谢版主
作者: 649678291    时间: 2015-5-10 10:28
应该是编译器问题

EEF4FF32-86B2-4000-AF7D-3BD4AD4B9EBC.png (47.39 KB, 下载次数: 49)

EEF4FF32-86B2-4000-AF7D-3BD4AD4B9EBC.png

作者: cui0wei0    时间: 2015-5-10 11:46
windows 就是一个坑, 还是用 Xcode 靠谱啊.
作者: 星空眼泪    时间: 2015-5-10 12:08
你错了吧,运行的结果明显是22,怎么可能是23呢?首先++a时先自增后运算,所以运算的时候应该是11,a++是先运算后自增,所以运算的时候也是11,那么b 的运算结果肯定是22,这个时候a=12.我字啊Xcode里面的运行也是22呢,你的运行结果为什么是23?
作者: 方的黑马    时间: 2015-5-10 13:01
为什么不能是24呢,也可以啊
作者: liu01230    时间: 2015-5-10 13:33
++a是a先加1然后再赋值,也就是++a的结果是11,此时a的值也是11。然后再运算a++,此时是先把a的值给运算结果,也就是a++的值是11,a的值则变成了12.所以最后的结果应该是22
作者: chensc    时间: 2015-5-10 13:45
学习学习!
作者: xiongmaoren518    时间: 2015-5-10 13:55
我也觉得应该是22呀,求大神指导
作者: 陈伟`    时间: 2015-5-10 14:07
很容易理解的 ,例如  int a = 10 , a++  是等于 11的 但是这是 a是等于10 的。 ++a也是等于11 不过这是a是等于11的。
作者: 15578797612    时间: 2015-5-10 15:20
我也觉得是22啊,++a之后a=11,a++之后a=11,应该是22吧
作者: 王鹏飞1    时间: 2015-5-10 20:11
你试了么。。。应该是11+11=22,
作者: YRDHelloworld    时间: 2015-5-10 21:55
这个明明b=22,执行++a的时候此时a=11,在执行a++的时候是根据前一个++a执行之后a的结果,所以此时a还是11,所以b=22
作者: wanjiadenghuo    时间: 2015-5-10 22:17
++a是a的值加1而且加1之后的这个值参与表达式计算中 a++是也是a的值加1,大师a的值加1后不参与表达式的计算中。
作者: 蓝色太阳    时间: 2015-5-10 22:32
先算括号里的啊!()优先级高!也就是 11+12=23
作者: T-fra    时间: 2015-5-10 22:47
说22的没看懂视频 的
作者: 一个土豆丶    时间: 2015-5-11 14:08
用断点  走一遍就知道了
作者: 飞翔的猪    时间: 2015-5-11 14:31
星空眼泪 发表于 2015-5-10 12:08
你错了吧,运行的结果明显是22,怎么可能是23呢?首先++a时先自增后运算,所以运算的时候应该是11,a++是先 ...

因为我用的devc++ windows下的编译器,。。。。
作者: 飞翔的猪    时间: 2015-5-11 14:32
xiongmaoren518 发表于 2015-5-10 13:55
我也觉得应该是22呀,求大神指导

编译器的问题,我证实了。。再也不用windows下的编译器了
作者: 飞翔的猪    时间: 2015-5-11 14:42
649678291 发表于 2015-5-10 10:28
应该是编译器问题

对 ,是编译器的问题,windows下的devc++
作者: guoqiangmailbox    时间: 2015-5-13 14:54
你应该看看,++n 还n++ 区别

aq.png (145.24 KB, 下载次数: 33)

aq.png

ba.png (36.76 KB, 下载次数: 32)

ba.png

作者: wodeheimalife    时间: 2015-5-16 09:39
必须是22 ,吓一跳。。
作者: 猴子啊猴子    时间: 2015-5-16 11:22
好像视频将的还是挺详细的
作者: doushu    时间: 2015-5-16 21:45
真笨呀 ,这都不会
作者: wwwwjay    时间: 2015-5-16 23:16
五楼正解
作者: LDstruggling    时间: 2015-10-22 21:34
++a后的a的结果是11,a++是在11的基础上加1,也就是12。11+12=23
作者: 孙明海    时间: 2015-10-22 22:32
不是22吗?你确定是23吗?
作者: StillSad    时间: 2015-10-23 10:53
不要纠结了,看看博客吧!http://bbs.csdn.net/topics/370153775
作者: 杰杰    时间: 2015-10-23 11:30
本帖最后由 杰杰 于 2015-10-23 11:32 编辑

int a = 10;
(a++)+(++a)

a++的值应该是10吧,然后a=11
a = 11的时候做++a
++a的值应该是12  这时a也应该等于12.
然后10+12等于22.
我来解释一下我怎么想的,在a++中a++的值等于a 的初始值,a一开始是等于10的,所以a++这个式子的值就等于10, 然后a的值经过++之后应该是等于11的,a的值和a++的值是不能混为一谈的。后面我就不说了

作者: 心程变    时间: 2015-10-23 13:20
看来是编译器的问题没错了,我也用的Dev c++,我擦,赶紧换掉
作者: 易沛东    时间: 2015-10-23 15:22
编译器肯定没问题,*(++a)和(a++)优先级都是一样的.
C不能保证(++a)和(a++)哪个先运算,最好的办法就是避免这种写法.
因为大多数编译器在某些细节方面是不一样的,这样写的话在移植到别的机器上就容易出现问题,需要调试.
作者: 谁在放荡    时间: 2015-10-23 16:09
明显22,而且,你的括号也是不需要的




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