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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© istream 中级黑马   /  2014-7-17 23:56  /  1979 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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:其实我想问的是编译器遇到这种情况是如何处理的,并不是不懂前置++和后置++的区别。

17 个回复

倒序浏览
a = a + a++;
个人理解为:
1. 首先执行加法运算: 4+4;
2. 然后a执行自增, 此时a的值为5;
3. 再然后执行赋值, a = 8. (a的自增是发生在赋值之前的, 所以值5会被8覆盖掉.

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

编译器所有的操作都遵循一定的规律,而不是想怎么做就怎么做,这个题目考查的不是运算符的优先级问题,而是有关临时变量,编译原理方面的知识。
回复 使用道具 举报
ofVv 发表于 2014-7-18 00:16
a = a + a++;
个人理解为:
1. 首先执行加法运算: 4+4;

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

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

点评

a++ = 10;++a = 10;哪个可以,哪个不可以?为什么呢?  发表于 2014-7-20 23:34
是这样,现在很多孩子都误解了,总纠结++a和a++的问题。不同编译器下,运行结果是不一样的。  发表于 2014-7-18 21:38
回复 使用道具 举报
这么多大神 回复啊,学习了~~
回复 使用道具 举报
fantacyleo 发表于 2014-7-18 10:19
你没搞明白我的意思。C从1989年起就是一门被标准化的语言,市面上广泛使用的编译器必然遵循C标准。你可以 ...

也就是求值顺序不同?
回复 使用道具 举报
istream 发表于 2014-7-18 13:08
也就是求值顺序不同?

http://bbs.itheima.com/thread-128465-1-1.html 这里我写得很清楚了
回复 使用道具 举报
a = 9, b = 9
回复 使用道具 举报
我的理解是:编译从右到左,a++时自增在赋值之后,++b时自增在赋值之前,因此 a = 5 + 4, b = 5 + 5 .
回复 使用道具 举报
++在前,先加再取值,++在后先取值再加,记住这个规则,屡试不爽
回复 使用道具 举报
这个跟java里的自增,自减一样,a++表示先赋值后加一,++b表示先加一后赋值,知道这个,这道题,没问题的
回复 使用道具 举报
路过 猜猜
回复 使用道具 举报
伊甸拾忆 来自手机 中级黑马 2014-7-27 12:48:34
16#
a=5+4=9    b=5+5=10
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马