2015-09-12 29 views
-2

這裏f(3 + 3)被替換爲f(6)= 6 * 6? 那麼輸出應該是36納呢?那麼爲什麼以及答案是15?在C++中使用預處理器時的輸出

#include <iostream> 
#define f(a) a*a 
using namespace std; 
int main(){ 
cout<<f(3+3); 
} 
+2

運算符優先和缺少括號。預處理器只是簡單的文本替換。想想結果。 –

+3

不要在C++中使用宏 - 問題已解決。 'int f(int a){return a * a; }而不是你的宏將_只是工作。 –

+0

@AlanStokes對於C來說,這只是真的,至少在這種情況下。 –

回答

4

宏調用

f(3 + 3) 

3 + 3 * 3 + 3 

這種替代是參數宏通常是括號之間放置的原因:

#define f(a) (a) * (a) 

作爲旁註,如果你使用一個變量而不是一個字面整數,並執行類似

int a = 3; 
int result = f(a++); 

然後,宏由

(a++) * (a++) 

導致a替換遞增兩次以未知的順序,導致未定義的行爲

在C++中,很少有用於類似函數的宏的問題,並且對於它們的所有問題(如上所示),你真的不應該使用它們。使用函數,它們的行爲是正確的,編譯器仍然可以內聯它們,並且它們是類型安全的(想想如果你做了什麼,例如f("3"),你可能會得到很難追查的奇怪錯誤)。

+2

你忘了把結果括起來。##define f(a)((a)*(a))'。 – Roddy

0

因爲3 + 3×3 + 3 = 15

嘗試使用括號來實現你想要的。