黑马程序员技术交流社区

标题: 一道关于a++与++a的无聊题目 [打印本页]

作者: 黑白世界    时间: 2015-9-21 13:14
标题: 一道关于a++与++a的无聊题目
有一下C语言代码:
int a = 2;
int b;
b = (++a)+(++a);
printf("b=%d",b);
运行结果是多少?



作者: 陆露    时间: 2015-9-21 13:29
b7
确定题目没打错? 记得基础测试题的时候 不是这样的
b = (++a)+(a++);
好像是这样的
作者: 黑白世界    时间: 2015-9-21 13:41
陆露 发表于 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
作者: HiGodl    时间: 2015-9-21 16:52
黑白世界 发表于 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
作者: Meracle    时间: 2015-9-21 17:46
这里用到左值和右值的概念。++a是左值,就是变量a,只不过是加1之后的。
所以经过两次++a后,a的值变为4,b = a + a = 4 + 4;
我理解的就是这么个意思.
作者: 陆露    时间: 2015-9-21 17:56
本帖最后由 陆露 于 2015-9-21 17:57 编辑
HiGodl 发表于 2015-9-21 16:52
你这个b = (++a)+(++a)
是不能这么算的,的确++a 的运算级别高,但是级别高低不是这样想的,第一个++a执 ...

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

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

亲,仔细看题,是b=(++a)+(++a);如果是(++a)+(a++)的话才是6
作者: 黑白世界    时间: 2015-9-22 09:46
所以就说这事一道无聊的题目了。。。
作者: 大宝820    时间: 2015-9-24 23:33
我也感觉是8{:2_30:}
作者: 枕上书    时间: 2015-9-25 00:09
b=7  第一个++a 表达式是3 a也是3  第二个此时a已经变为3了  所以 表达式=a=4   合起来是7
作者: 请叫我焦卷卷    时间: 2015-9-25 00:28
结果是7 ,a初始值是2,经过++a,式子值为3,a值为3,再经过一次++a,式子值为4,a值为4,b是两次式子值的加和,所以是7.
作者: jianjiao    时间: 2015-9-26 08:40
编译有警告吧
作者: lumangmang    时间: 2015-9-26 09:28
结果不是7么
作者: 杰杰    时间: 2015-9-26 10:59
我感觉应该是7,要是错的话我又要回头去看自增自减的基础了,,,
作者: 睡觉就有梦想    时间: 2015-9-26 11:19
学习学习
作者: wwf707542865    时间: 2015-9-26 17:43
++a,我们在使用的时候注意a的值和++a这个表达式的值,++在前面,要把a先自增之后的值赋给++a这个表达式,所以3+4=7无误




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