2010-03-22 127 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