黑马程序员技术交流社区

标题: 求解难题,大神速来 [打印本页]

作者: istream    时间: 2014-7-17 23:56
标题: 求解难题,大神速来
本帖最后由 istream 于 2014-7-23 22:29 编辑

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int a = 4;
  5.         int b = 4;
  6.         a = a + a++;
  7.         b = b + ++b;
  8.         printf("a = %d, b = %d\n", a, b);
  9.         return 0;
  10. }
复制代码


请问代码执行结果是什么?为什么?

ps:其实我想问的是编译器遇到这种情况是如何处理的,并不是不懂前置++和后置++的区别。

作者: ofVv    时间: 2014-7-18 00:16
a = a + a++;
个人理解为:
1. 首先执行加法运算: 4+4;
2. 然后a执行自增, 此时a的值为5;
3. 再然后执行赋值, a = 8. (a的自增是发生在赋值之前的, 所以值5会被8覆盖掉.

b = b + (++b)
这个就是 b = 4 + 5, 原理和a一样, 赋值运算是最后一步.
作者: fantacyleo    时间: 2014-7-18 00:16
又是这类问题。只能见一次说一次:除了&&、||、逗号运算符和三目运算符,C语言的表达式求值顺序是未定义的。编译器高兴怎么做就怎么做http://bbs.itheima.com/thread-128465-1-1.html
作者: ofVv    时间: 2014-7-18 00:33
学习了!
作者: istream    时间: 2014-7-18 07:48
fantacyleo 发表于 2014-7-18 00:16
又是这类问题。只能见一次说一次:除了&&、||、逗号运算符和三目运算符,C语言的表达式求值顺序是未定义的 ...

编译器所有的操作都遵循一定的规律,而不是想怎么做就怎么做,这个题目考查的不是运算符的优先级问题,而是有关临时变量,编译原理方面的知识。

作者: istream    时间: 2014-7-18 07:50
ofVv 发表于 2014-7-18 00:16
a = a + a++;
个人理解为:
1. 首先执行加法运算: 4+4;

运算结果在VS下面是a=9,b=10;
作者: fantacyleo    时间: 2014-7-18 10:19
istream 发表于 2014-7-18 07:48
编译器所有的操作都遵循一定的规律,而不是想怎么做就怎么做,这个题目考查的不是运算符的优先级问题,而 ...

你没搞明白我的意思。C从1989年起就是一门被标准化的语言,市面上广泛使用的编译器必然遵循C标准。你可以说每种编译器有自己固定的计算顺序,但你不能保证两种编译器采用相同的计算顺序,因为C标准没有强制规定,只要遵循优先级和结合性,编译器怎么实现都不违背标准。android区已经有人在不同编译器上测试过这个问题了http://bbs.itheima.com/thread-129127-1-1.html 另外,优先级和表达式求值顺序没有任何关系,认为二者有关是常见的误解。
作者: zhuiyi007    时间: 2014-7-18 12:52
这么多大神 回复啊,学习了~~
作者: istream    时间: 2014-7-18 13:08
fantacyleo 发表于 2014-7-18 10:19
你没搞明白我的意思。C从1989年起就是一门被标准化的语言,市面上广泛使用的编译器必然遵循C标准。你可以 ...

也就是求值顺序不同?

作者: fantacyleo    时间: 2014-7-18 13:19
istream 发表于 2014-7-18 13:08
也就是求值顺序不同?

http://bbs.itheima.com/thread-128465-1-1.html 这里我写得很清楚了
作者: 小海    时间: 2014-7-18 20:55
a = 9, b = 9
作者: LuckyMe    时间: 2014-7-18 22:12
我的理解是:编译从右到左,a++时自增在赋值之后,++b时自增在赋值之前,因此 a = 5 + 4, b = 5 + 5 .
作者: megatron    时间: 2014-7-18 23:03
++在前,先加再取值,++在后先取值再加,记住这个规则,屡试不爽
作者: 火拳    时间: 2014-7-20 10:37
这个跟java里的自增,自减一样,a++表示先赋值后加一,++b表示先加一后赋值,知道这个,这道题,没问题的
作者: 淡淡柠檬茶    时间: 2014-7-21 00:03
路过 猜猜
作者: 伊甸拾忆    时间: 2014-7-27 12:48
a=5+4=9    b=5+5=10




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