#define的奇怪行为

Spa*_*row 0 c c-preprocessor

我有以下代码.

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

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

Tom*_*ski 10

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

printf("%d",d*d);
Run Code Online (Sandbox Code Playgroud)

改变为

printf("%d",10+10*10+10);
Run Code Online (Sandbox Code Playgroud)

这是10 + 100 + 10 = 120

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

#define d (10+10)
Run Code Online (Sandbox Code Playgroud)