這裏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);
}
這裏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);
}
宏調用
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")
,你可能會得到很難追查的奇怪錯誤)。
你忘了把結果括起來。##define f(a)((a)*(a))'。 – Roddy
因爲3 + 3×3 + 3 = 15
嘗試使用括號來實現你想要的。
運算符優先和缺少括號。預處理器只是簡單的文本替換。想想結果。 –
不要在C++中使用宏 - 問題已解決。 'int f(int a){return a * a; }而不是你的宏將_只是工作。 –
@AlanStokes對於C來說,這只是真的,至少在這種情況下。 –