我有以下代码。
#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.任何人都可以给我这个行为的解释吗?
答案 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);