2016-11-30 58 views
0
#define ABC 20 
#define XYZ 10 
#define XXX ABC - XYZ 

main() 
{ 
int  a; 
a = XXX * 10; 
printf("%d\n", a); 
} 

我選中XXX的值爲10.那麼爲什麼輸出-80?這可能很愚蠢,但我是c編程新手。爲什麼下面的程序將-80作爲輸出?

+1

你錯過了運營商preceedence http://en.cppreference.com/w/c/language/operator_precedence – Aus

+0

我希望這只是一個練習。你永遠不會在現實世界中編寫這樣的代碼。順便說一下你期望的結果是什麼? –

+0

@Michael Walz你自然是啞巴還是玩笨?如果XXX是10..basic乘法表表明10 * 10是100.如果你仍然不明白,願上帝能幫助你! – Vivek

回答

4

在你的代碼

a = XXX * 10; 

相同

a = ABC - XYZ * 10; 

這是

a = 20 - 10 * 10; 

答案是20 -100-80

這就是爲什麼一般建議在MACRO定義中使用括號的原因。像

#define XXX (ABC - XYZ) 

的東西是什麼,你是期待

也就是說,託管環境中的main()的符合簽名至少是int main(void)

1

這就是預處理器的工作原理。定義不會創建部分表達式或語句。相反,宏由字面意思取而代之。

因此在

a = XXX * 10; 

XXX是字面上

ABC - XYZ 

a = ABC - XYZ * 10; 

因爲*-更高的結合是什麼結果,這是

取代
a = ABC - (XYZ * 10); 

這是-80。

這是至少寫身邊的表達括號中宏是個好主意:

#define XXX (ABC - XYZ)