免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1834 | 回复: 5
打印 上一主题 下一主题

[C] 预处理的一个小问题,请解答下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-19 18:01 |只看该作者 |倒序浏览
  1. #define SQUARE(a)((a)*(a))

  2.             int a=5;
  3.             int b;
  4.             b=SQUARE(a++);
复制代码
这个结果是25。

而如果是b=SQUARE(++a);结果却是49。
不解,第一个为何不是30=5*(5+1)。
第二个结果为何是49,不是36或者30。
请解答下,谢谢。预处理这块却是了解不多。

论坛徽章:
0
2 [报告]
发表于 2012-10-19 18:13 |只看该作者
以后谁再出这种让人蛋疼的面试题面试你,就直接封杀!

论坛徽章:
0
3 [报告]
发表于 2012-10-19 18:16 |只看该作者
xdsupermanli 发表于 2012-10-19 18:13
以后谁再出这种让人蛋疼的面试题面试你,就直接封杀!

木办法啊,还在苦寻工作中~~  得要准备下  我真希望笔试时候可以用电脑或者man手册……

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2012-10-19 18:22 |只看该作者
在编译阶段之前,预处理就完了。

这个和预处理没有半毛钱的关系,倒是和a++*a++这种无聊的表达式有关系。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
5 [报告]
发表于 2012-10-20 00:32 |只看该作者
本帖最后由 Ager 于 2012-10-20 00:34 编辑
L_kernel 发表于 2012-10-19 18:22
在编译阶段之前,预处理就完了。

这个和预处理没有半毛钱的关系,倒是和a++*a++这种无聊的表达式有关系。 ...


顶一下LK大虾

我再补充一点儿……

对于楼主的这个结果,我只知道,在我用的GCC背景下,是这样的:
  1. c = a++ * a++;
  2.    6:   8b 45 fc                mov    -0x4(%ebp),%eax
  3.    9:   0f af 45 fc             imul   -0x4(%ebp),%eax
  4.    d:   89 45 f8                mov    %eax,-0x8(%ebp)
  5.   10:   83 45 fc 01             addl   $0x1,-0x4(%ebp)
  6.   14:   83 45 fc 01             addl   $0x1,-0x4(%ebp)
  7. d = ++b * ++b;
  8.   18:   83 45 f4 01             addl   $0x1,-0xc(%ebp)
  9.   1c:   83 45 f4 01             addl   $0x1,-0xc(%ebp)
  10.   20:   8b 45 f4                mov    -0xc(%ebp),%eax
  11.   23:   0f af 45 f4             imul   -0xc(%ebp),%eax
  12.   27:   89 45 f0                mov    %eax,-0x10(%ebp)
复制代码
我再强调一下:

(1)不能靠运行结果去猜测并且推定编译细节。要了解编译细节,就用编译器工具。看到的,只能说明关于被看到的东东的问题;看不到的,不要做任何推定,惟有保持沉默。

(2)(更加地!)不能靠运行结果去猜测并且推定C语言的法则(标准)。要了解法则,就阅读关于它们的文档。读到的,只能说明关于被读到的东东的问题;读不到的,不要做任何推定,惟有保持沉默。

(3)关于法则(标准)的文档,明确告诉我,形如楼主这样的式子,是属于“未定义的”。在我可以自由裁量的权利得以维护的情况下,我直接认为:这种式子,根本就是错的!必须杜绝。

以上,仅供参考,呵呵 ——:)



论坛徽章:
0
6 [报告]
发表于 2012-10-20 21:29 |只看该作者
Ager 发表于 2012-10-20 00:32
顶一下LK大虾  

我再补充一点儿……

多谢楼上诸位了。 我决定放弃这个题目了,还是多准备一些常规题目吧~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP