#include<stdio.h>
#include<conio.h>
#define ABC 20
#define XYZ 10
#define XXX ABC - XYZ
void main()
{
int a;
a = XXX * 10;
printf("\n %d \n", a);
getch();
}
我认为输出应该是100但是当我看到结果时我发现输出为-80。当我将括号设为#define XXX (ABC-XYZ)
时,我输出为100但没有括号我输出为-80。
答案 0 :(得分:13)
预处理器是一个愚蠢的野兽。它在纯粹的文本级别上工作,而不考虑它在语义上对代码所做的事情。让我们看看它在这种情况下的作用:
a = XXX * 10;
变为
a = ABC - XYZ * 10;
成为
a = 20 - 10 * 10;
显然是-80
。
可能的目的是
#define XXX (ABC - XYZ)
这就是为什么宏被认为是邪恶的一个原因。
答案 1 :(得分:3)
a = XXX * 10;
编译前将更改为以下内容:
a = 20 - 10 * 10;
评估为-80
答案 2 :(得分:2)
正是这样计算,
20-10 * 10
在宏XXX中使用大括号。
#define XXX (ABC-XYZ)
答案 3 :(得分:2)
这里XXX被ABC-XYZ取代所以它 看起来像下面的
20 - 10 * 10
所以输出是-80