我寫了下面的C程序。輸出是32.這是爲什麼?輸出一個C程序
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define max 10+2
int main(){
int i;
i = max * max;
printf("\n%d\n",i);
return 0;
}
(我學習C和是比較新的了。)
我寫了下面的C程序。輸出是32.這是爲什麼?輸出一個C程序
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define max 10+2
int main(){
int i;
i = max * max;
printf("\n%d\n",i);
return 0;
}
(我學習C和是比較新的了。)
#define max 10+2
這是預處理器。它不聰明。
這是愚蠢的。
它只替換文本。
max*max
將解析到
10+2*10+2
是
10+(2*10)+2
因爲操作者的優先級,這是
10 + 20 + 2
即32
此外,你應該避免時,你可以並用預處理宏。您可能會或可能不希望也考慮使用static const
代替const
變量或enum
而不是#define
;每個人都有他們的權衡,參考類似的問題:"static const" vs "#define" vs "enum"。
如果你想堅持到預處理器,那麼你可以只使用:
#define max (10+2)
由於parenthesised代碼將採取運營商precendence。
最後一行是不好的建議。在C中,一個'static const'變量比每個單獨的預處理器宏更糟(作爲常量)。通過向宏添加正確的括號可以輕鬆解決問題。 – 2012-03-26 03:49:19
@R ..你能解釋爲什麼它更糟。 – 2012-03-26 03:56:50
Bigges之一就是它不是一個常量表達式,所以它不能用於需要常量表達式的上下文中,甚至不能用作其他靜態常量對象的初始化方法。 – 2012-03-26 04:41:08
編譯器看到這個
i = 10 + 2*10 +2 = 32
你應該做的宏定義這樣
#define max (10+2)
由於max
是一個宏,因此它會以文本方式進行擴展,因此您的代碼將與:
i = 10 +2 * 10 + 2;
對於這樣一個宏,你通常要添加括號:
#define max (10+2)
所以,你的表達將擴大到:
i = (10+2) * (10+2);
運算符優先級是一件有趣的事情。 PEMDAS = Parenthises,Exponents,Multiply,Divide,Add,Subtract。
這是要解決到等於10 +(2 * 10)+ 2 第一個是10 * 2,等於20。
現在顯示的是10 + 20 + 2 其餘部分應是明確。
您應該在需要時對您的算術進行控制。
PEMDAS並沒有真正在C.應用。例如,'3 << 1 + 2'產生24,而不是8 – 2012-03-26 03:50:49
事實上,忘掉PEMDAS,這對你沒有好處的C.拿這個不起眼的,但有效的例子'a * = - ++ b/c;'。減去然後加,然後除,然後相乘。 – Lundin 2012-03-26 11:29:44
如果我告訴你編譯器實際看到的是「'i = 10 + 2 * 10 + 2;'」,它有幫助嗎? – zwol 2012-03-26 03:24:50