2010-03-22 77 views
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。为什么“a”的输出是-80?

+2

是这个功课? – Thomas 2010-03-22 11:06:21

+0

问题的标题没有给出关于它是什么的很多信息。在看主页时,不知道在阅读之前他是否会有线索 – 2010-03-22 11:20:02

回答

13

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

a = XXX * 10; 

成为

a = ABC - XYZ * 10; 

成为

a = 20 - 10 * 10; 

这是很明显,-80

什么,可能是为了为

#define XXX (ABC - XYZ) 

这就是为什么宏被认为是邪恶的。

+1

哦,谢谢你这么容易,我很困惑。我认为我的大脑现在不能工作一天。 :) – Abhineet 2010-03-22 11:09:46

3
a = XXX * 10; 

将变更为以下编译之前:

a = 20 - 10 * 10; 

计算结果为-80

2

据计算这个样子,

20-10 * 10

宏XXX使用大括号。

#define XXX (ABC-XYZ) 
2

这里XXX是由ABC-XYZ更换所以 是看起来像遵循

20 - 10 * 10

所以输出-80