为什么“a”的输出是-80?

时间:2010-03-22 11:05:54

标签: c c-preprocessor operator-precedence side-effects

#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 个答案:

答案 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