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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑白世界 中级黑马   /  2015-9-21 13:14  /  2766 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一下C语言代码:
int a = 2;
int b;
b = (++a)+(++a);
printf("b=%d",b);
运行结果是多少?


20 个回复

倒序浏览
b7
确定题目没打错? 记得基础测试题的时候 不是这样的
b = (++a)+(a++);
好像是这样的
回复 使用道具 举报
陆露 发表于 2015-9-21 13:29
b7
确定题目没打错? 记得基础测试题的时候 不是这样的
b = (++a)+(a++);

嗯哪,没有打错,确实是两边++a;++的运算级高于+的晕眩级别。两次的++运算,a=4,b=4+4=8
所以结果是b=8。
至于b=(++a)+(a++)
这样的提在网上一直有争议,又说7的有说8的。还有说6的。编译器不同,计算机关也不一样。在code block里是7,在xcode中是6
回复 使用道具 举报
黑白世界 发表于 2015-9-21 13:41
嗯哪,没有打错,确实是两边++a;++的运算级高于+的晕眩级别。两次的++运算,a=4,b=4+4=8
所以结果是b=8 ...

你这个b = (++a)+(++a)
是不能这么算的,的确++a 的运算级别高,但是级别高低不是这样想的,第一个++a执行完之后是把++a的结果赋值给表达式的,而不是变量a,所以b = 3+(++a),接下来是第二个++a,得到的运算结果赋值给表达式,也就是把第二次++a(a此时为3)的结果赋值给表达式,也就是b = 3+4。。最终结果为7
回复 使用道具 举报
这里用到左值和右值的概念。++a是左值,就是变量a,只不过是加1之后的。
所以经过两次++a后,a的值变为4,b = a + a = 4 + 4;
我理解的就是这么个意思.
回复 使用道具 举报
本帖最后由 陆露 于 2015-9-21 17:57 编辑
HiGodl 发表于 2015-9-21 16:52
你这个b = (++a)+(++a)
是不能这么算的,的确++a 的运算级别高,但是级别高低不是这样想的,第一个++a执 ...

我没算错吧?
回复 使用道具 举报
lvfx 中级黑马 2015-9-21 18:04:00
7#
记住先参与运算或赋值还是先自加一就行了
回复 使用道具 举报
结果是7
回复 使用道具 举报
结果7无误
回复 使用道具 举报
这道题我也看了   6
回复 使用道具 举报
C这种用法是不科学的,错误的
C语言标准中明确指出了这种写法会导致*未定义行为(Undefined Behavior)*
按照过去的序列点解释,C语言表达式的副作用和求职都会在序列点前完成,两个序列点直接副作用发生的顺序和求值顺序取决于具体的编译器实现,不同实现会引起不同的结果,针对楼主的这个写法,VS,gcc,clang编译后运行的结果都是不同的,纠结这个问题没有意义,通过查看反汇编可以探究不同编译器的实现策略

大体来说,VS采用了从右向左计算的求值策略,gcc使用了先进行双目运算再进行弹幕运算的运算策略,这两种策略的结果不同,但都是符合语言标准的行为
回复 使用道具 举报
木子青 发表于 2015-9-21 21:47
这道题我也看了   6

亲,仔细看题,是b=(++a)+(++a);如果是(++a)+(a++)的话才是6
回复 使用道具 举报
所以就说这事一道无聊的题目了。。。
回复 使用道具 举报
我也感觉是8{:2_30:}
回复 使用道具 举报
b=7  第一个++a 表达式是3 a也是3  第二个此时a已经变为3了  所以 表达式=a=4   合起来是7
回复 使用道具 举报
结果是7 ,a初始值是2,经过++a,式子值为3,a值为3,再经过一次++a,式子值为4,a值为4,b是两次式子值的加和,所以是7.
回复 使用道具 举报 1 0
编译有警告吧
回复 使用道具 举报
结果不是7么
回复 使用道具 举报
我感觉应该是7,要是错的话我又要回头去看自增自减的基础了,,,
回复 使用道具 举报
学习学习
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马