2017-10-20 58 views
0

我面臨的問題是如何理解#define是如何工作的。如何定義有運算符的值時#define如何工作?

#include<stdio.h> 
#define x 6+3 
int main(){ 

int i; 
i=x; //9 
printf("%d\n",i); 
i=x*x; //27 
printf("%d\n",i); 
i=x*x*x; //45 
printf("%d\n",i); 
i=x*x*x*x; //63 
printf("%d\n",i); 

return 0; 
} 

如果我使用#define x 6+3輸出是9月27日45 63

如果我使用#define x (6+3)輸出爲9 81 729 6561

+7

要了解,我建議你自己動手完成的宏擴展明白髮生了什麼。 – user694733

+0

#define通過文本替換工作。 –

+0

從上面的評論,讓你開始'i = x * X' - >'i = 6 + 3 * 6 + 3' –

回答

5

#define只是替換字符令牌(在你的情況x)與你定義它是什麼。 所以,你的例子是這樣的預處理器做了他的工作後:

#include<stdio.h> 
#define x 6+3 
int main(){ 

    int i; 
    i=6+3; //9 
    printf("%d\n",i); 
    i=6+3*6+3; //27 
    printf("%d\n",i); 
    i=6+3*6+3*6+3; //45 
    printf("%d\n",i); 
    i=6+3*6+3*6+3*6+3; //63 
    printf("%d\n",i); 

    return 0; 

} 

如果你看在它你知道爲什麼例如第二個例子是27而不是81(*之前的+)。另一方面,如果你寫(6 + 3)它將是9 * 9,那就是你期望的結果。

+3

」*替換變量*「有點令人誤解,因爲預處理器不知道*關於」變量「。後一句更好地閱讀「替換字符標記」。 – alk

+0

哦,你是對的。謝謝。 – Rafiwui

2

這是一個運算符優先級的情況。你可以研究一下。我在這個問題上描述如下。

如果使用

#define x 6+3 

然後

x = 6+3= 9 

x*x = 6+3 * 6+3 = 6+18+3 = 27 (as * has higher precedence as operator than + ; so 3*6 will be evaluated earlier) 

,同樣不勝枚舉。

現在,如果你使用

#define x (6+3) 

然後

x = (6+3) = 9 

x*x = (6+3)*(6+3) = 9*9 = 81 

,同樣不勝枚舉。

所以我的建議是使用括號總是爲了更好的可讀性和理解。

1

宏的名稱被內容替換。這意味着

#define x 6+3 
x*x*x*x = 6+3*6+3*6+3*6+3 = 6+18+18+18+3 

當您將x定義爲插入(6 + 3) - (6 + 3)時。這意味着

#define x (6+3) 
x*x*x*x = (6+3)*(6+3)*(6+3)*(6+3) = 9*9*9*9 

閱讀C Preprocessor and Macros

1

宏擴展是一個文本替換。所以

#define x 6 + 3 
#define y (6+3) 

提供了以下

printf("%d %d\n", x , y);  // 6 +3 , (6+3) is 9 and 9 
printf("%d %d\n", x *x , y * y); // 6 + 3 * 6 + 3, (6+3) * (6+3) 
            // 6 + 18 + 3 , 9  * 9 
            //  27  , 81 
相關問題