2015-02-23 107 views
0

所以我寫了一個簡單的程序,試圖獲得#define宏的更基本的理解,我想知道這兩個程序之間的區別是什麼,是否有任何根本原因使用第三個程序? :簡單的C預處理器替換

#include<stdio.h> 
#define x 7 

int main() 
{ 
    int i; 
    i = x * x * x; 
    printf("%d", i); 
    return 0; 
} 

該程序,因爲7 * 7 * 7 = 343

#include<stdio.h> 
#define x 5+2 

int main() 
{ 
    int i; 
    i = x * x * x; 
    printf("%d", i); 
    return 0; 
} 

該程序打印出27從操作順序打印出343。 編輯 辦法,迫使第二個打印出343,我們可以加上括號,所以我們可以做到以下幾點:

#include<stdio.h> 
#define x (5+2) 

int main() 
{ 
    int i; 
    i = x * x * x; 
    printf("%d", i); 
    return 0; 
} 

會不會有任何理由做這種,而不是第一呢?

+0

嚴格地講,它只是一個字符串替換。 – 2015-02-23 21:09:58

回答

3

宏替換替換文本,因爲它是

因此C編譯器看到代碼

i = 7 * 7 * 7;  // when #DEFINE x 7 

在一種情況下,並且在以下另一

i = 5+2 * 5+2 * 5+2; // when #DEFINE x 5+2 

(並且由於簡單arthihmetic優先的結果是平凡不同。)


爲了讓他們eq uivalent一個需要添加括號,如(首選,見註釋):

#define x (5+2) 

雖然下面就「足夠了」這裏

i = (x) * (x) * (x); 
+2

'#define x(5 + 2)'是解決這個問題的正確方法。宏應該總是這樣寫:每個參數都應該在擴展中加括號,整個表達式應該用括號括起來。在特殊情況下,可以容忍罕見的例外,這遠遠超出了這個問題的範圍。 – chqrlie 2015-02-23 21:18:16