2012-03-26 76 views
3

我寫了下面的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和是比較新的了。)

+1

如果我告訴你編譯器實際看到的是「'i = 10 + 2 * 10 + 2;'」,它有幫助嗎? – zwol 2012-03-26 03:24:50

回答

6
#define max 10+2 

這是預處理器。它不聰明。

這是愚蠢的。

它只替換文本。

max*max 

將解析到

10+2*10+2 

10+(2*10)+2 

因爲操作者的優先級,這是

10 + 20 + 2 

32

0123的

此外,你應該避免時,你可以並用static const代替預處理宏。您可能會或可能不希望也考慮使用const變量或enum而不是#define;每個人都有他們的權衡,參考類似的問題:"static const" vs "#define" vs "enum"

如果你想堅持到預處理器,那麼你可以只使用:

#define max (10+2) 

由於parenthesised代碼將採取運營商precendence。

+4

最後一行是不好的建議。在C中,一個'static const'變量比每個單獨的預處理器宏更糟(作爲常量)。通過向宏添加正確的括號可以輕鬆解決問題。 – 2012-03-26 03:49:19

+0

@R ..你能解釋爲什麼它更糟。 – 2012-03-26 03:56:50

+0

Bigges之一就是它不是一個常量表達式,所以它不能用於需要常量表達式的上下文中,甚至不能用作其他靜態常量對象的初始化方法。 – 2012-03-26 04:41:08

1

編譯器看到這個

i = 10 + 2*10 +2 = 32 

你應該做的宏定義這樣

#define max (10+2) 
2

由於max是一個宏,因此它會以文本方式進行擴展,因此您的代碼將與:

i = 10 +2 * 10 + 2; 

對於這樣一個宏,你通常要添加括號:

#define max (10+2) 

所以,你的表達將擴大到:

i = (10+2) * (10+2); 
0

運算符優先級是一件有趣的事情。 PEMDAS = Parenthises,Exponents,Multiply,Divide,Add,Subtract。

這是要解決到等於10 +(2 * 10)+ 2 第一個是10 * 2,等於20。

現在顯示的是10 + 20 + 2 其餘部分應是明確。

您應該在需要時對您的算術進行控制。

+0

PEMDAS並沒有真正在C.應用。例如,'3 << 1 + 2'產生24,而不是8 – 2012-03-26 03:50:49

+0

事實上,忘掉PEMDAS,這對你沒有好處的C.拿這個不起眼的,但有效的例子'a * = - ++ b/c;'。減去然後加,然後除,然後相乘。 – Lundin 2012-03-26 11:29:44