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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飞翔的猪 中级黑马   /  2015-5-9 15:16  /  4129 人查看  /  51 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看了李明杰老师的视频,做了做实验,发现一个问题求大神指导。
int a=10;

int b=(++a)+(a++);
运行结果是b=23。。。我想知道怎么回事

51 个回复

倒序浏览
++a后的a的结果是11,a++是在11的基础上加1,也就是12。11+12=23
回复 使用道具 举报
这里是我在网上找的,关于++a和a++解释的挺好:
回复 使用道具 举报
你可以这样来想:++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)这里就有区别了!
回复 使用道具 举报
b = 22 哪来的23? 视频上讲的很清楚噻
回复 使用道具 举报
wangsong 发表于 2015-5-9 16:48
你可以这样来想:++a和a++,都是个表达式,最后的结果就取决于是先加,还是后加,如果是先加,那么最后的表 ...

结果不对把  ,b=(++a)+(a++)  (++a) 是11  (a++) 取值为11  之后a为12 ,按照视频上的结果该为22,凌乱了。。
回复 使用道具 举报
wzboy 发表于 2015-5-9 16:53
b = 22 哪来的23? 视频上讲的很清楚噻

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

结果就是22啊 你敲代码了没?把你的运行结果截个图看看
回复 使用道具 举报
这是运行结果 用的是DEV C++编译器

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

QQ截图20150509170205.png
回复 使用道具 举报
wzboy 发表于 2015-5-9 16:59
结果就是22啊 你敲代码了没?把你的运行结果截个图看看

这是结果

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

QQ截图20150509170205.png
回复 使用道具 举报
飞翔的猪 发表于 2015-5-9 17:04
这是运行结果 用的是DEV C++编译器

代码就是你刚才帖子上的?我用c-Free 和 Xcode 都是22 老师讲的也是22
你再换个编译器试试
回复 使用道具 举报
wzboy 发表于 2015-5-9 17:07
代码就是你刚才帖子上的?我用c-Free 和 Xcode 都是22 老师讲的也是22
你再换个编译器试试  ...

嗯嗯,我试试在linux下用gcc试试 可能就是编译器的问题
回复 使用道具 举报
wzboy 发表于 2015-5-9 17:07
代码就是你刚才帖子上的?我用c-Free 和 Xcode 都是22 老师讲的也是22
你再换个编译器试试  ...

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

你把括号去了再试试,这里面有优先级的问题
回复 使用道具 举报
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
回复 使用道具 举报
结果是22.。。。你的源代码是什么
回复 使用道具 举报
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:25 编辑

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

回复 使用道具 举报
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
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马