#define的奇怪行为

时间:2014-07-31 10:46:48

标签: c c-preprocessor

我有以下代码。

#include <stdio.h>
#define d 10+10
int main()
{
    printf("%d",d*d);
    return 0;
}

当10 + 10 = 20时,我认为d在程序中到处都是20。但是当我执行d * d时,我预计结果为d * d = 20 * 20 = 400。但结果打印为120.任何人都可以给我这个行为的解释吗?

4 个答案:

答案 0 :(得分:10)

预处理器只是简单的“查找和替换”,所以这段代码:

printf("%d",d*d);

更改为

printf("%d",10+10*10+10);

是10 + 100 + 10 = 120

这就是为什么在定义中添加parens非常重要的原因:

#define d (10+10)

答案 1 :(得分:3)

printf("%d",d*d);

此处d被替换为printf("%d",10+10*10+10)。所以在这种情况下,它首先执行10*10并添加10+100+10。结果120。

消除这种情况 -

#define d (10+10) // FIX
int main()
{
   printf("%d",d*d);
   return 0;
}

答案 2 :(得分:1)

更改

#define d 10+10

#define d (10+10)

没有正确括号的内容是10+10*10+10,与10 + (10 * 10) + 10相同

答案 3 :(得分:1)

printf("%d",d*d)将评估(预处理后)printf("%d", 10+10*10+10);