#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作爲輸出?
#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作爲輸出?
在你的代碼
a = XXX * 10;
相同
a = ABC - XYZ * 10;
這是
a = 20 - 10 * 10;
答案是20 -100
,-80
。
這就是爲什麼一般建議在MACRO定義中使用括號的原因。像
#define XXX (ABC - XYZ)
的東西是什麼,你是期待。
也就是說,託管環境中的main()
的符合簽名至少是int main(void)
。
這就是預處理器的工作原理。定義不會創建部分表達式或語句。相反,宏由字面意思取而代之。
因此在
a = XXX * 10;
XXX是字面上
ABC - XYZ
在
a = ABC - XYZ * 10;
因爲*
比-
更高的結合是什麼結果,這是
a = ABC - (XYZ * 10);
這是-80。
這是至少寫身邊的表達括號中宏是個好主意:
#define XXX (ABC - XYZ)
你錯過了運營商preceedence http://en.cppreference.com/w/c/language/operator_precedence – Aus
我希望這只是一個練習。你永遠不會在現實世界中編寫這樣的代碼。順便說一下你期望的結果是什麼? –
@Michael Walz你自然是啞巴還是玩笨?如果XXX是10..basic乘法表表明10 * 10是100.如果你仍然不明白,願上帝能幫助你! – Vivek