2016-04-30 83 views
1

我有這段代碼從考試的C + +代碼。我們只是想寫出程序的輸出是什麼,我假設輸出是'20',但輸出是'10'。爲什麼是這樣?宏函數參數中的C++加法

#define func(x) (x*x)-x 

int i=3; 

int main() { 
    cout << func(i+2) << endl; 
} 

如果我把第i + 2在括號中所示:

cout << func((i+2)) << endl; 

的輸出是 '20' 作爲假定的那樣。

C++如何處理這段代碼,使其返回10而不是20?

+0

宏只做文本替換,'func'不是函數。 –

回答

6

這就是宏如何工作。這是純文本替換。所以func(i+2)擴展爲:

(i+2*i+2)-i+2 

這是說:

2*i + 4 

這就是爲什麼通常宏將被過度圓括號的參數寫入:

#define func(x) (((x)*(x))-(x)) 

不過說真的,這是爲什麼你應該更喜歡函數宏。儘管將參數加括號可以修復func(i+2)中的用法,但它仍不會修復func(++i)中的用法 - 雖然如果func是函數是一個簡單的表達式,但與宏一起未定義的行爲。

+0

謝謝我不知道這個,我猜教授只是試圖通過稱它爲'func'來趕上我們。 – TheDream

4

因爲括號不存在。

的宏擴展到

(i+2*i+2)-i+2 

而且這一切都錯在那裏。一個內聯函數,而不是一個宏只會工作。

要學習的教訓:(1)在宏定義中總是用括號括起來。 (2)不要在C++中使用宏!

+0

也謝謝。沒有意識到這一點。 – TheDream