2
#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。

4

4 回答 4

13

预处理器是一个愚蠢的野兽。它在纯文本级别上工作,而不考虑它在语义上对代码所做的事情。让我们看看它在这种情况下做了什么:

a = XXX * 10;

变成

a = ABC - XYZ * 10;

变成

a = 20 - 10 * 10;

这显然是-80.

可能的意图是

#define XXX (ABC - XYZ)

这就是为什么宏被认为是邪恶的原因之一。

于 2010-03-22T11:07:48.890 回答
3
a = XXX * 10;

编译前会变成如下:

a = 20 - 10 * 10;

评估为-80

于 2010-03-22T11:07:26.370 回答
2

它是这样计算的,

20-10*10

在宏 XXX 中使用大括号。

#define XXX (ABC-XYZ)
于 2010-03-22T11:10:19.103 回答
2

这里 XXX 被替换为 ABC-XYZ 所以它看起来像下面

20 - 10 * 10

所以输出是-80

于 2010-03-22T11:17:14.350 回答