2017-02-04 46 views
-2

我有這個功能,它自己添加一個數字。#define ADD(x)(x)+(x)返回錯誤結果

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

#define ADD(x) (x)+(x) 
int main() 
{ 
    int x = 2; 
    int y = ADD(++x); 

    cout << y << endl; 
} 

當我運行這個程序,它會返回8,但我還是希望6.

我想X = 3,這是送3 ADD功能,但現在看來似乎沒有。有人可以向我解釋嗎?

+0

如果您只是調用ADD(2),它會返回什麼? –

+2

這是創建內聯函數的舊方法。現在嘗試不這樣做。 –

+1

[C中宏需要括號](http://stackoverflow.com/q/10820340/995714) –

回答

9

程序具有不確定的行爲,因爲你兩次調用前增量操作:int y = (++x)+(++x);。你沒有得到編譯器警告嗎?

問題是ADD不是函數。這是一個宏觀;它執行文本替換。不要在C++中使用這些宏。

如果你把宏插入功能,一切都將正常工作,因爲那時++x只出現一次:

#include <iostream> 

template <class T> 
T add(T x) 
{ 
    return x + x; 
} 

int main() 
{ 
    int x = 2; 
    int y = add(++x); 

    std::cout << y << '\n'; 
} 
+1

cout << add(++ x)<< endl;'會產生什麼結果?而不是將回報存儲在'y'中。 – Raindrop7

+0

@ Raindrop7:你爲什麼問?你試過時是不是打印出「add」的結果? –

+0

謝謝,我現在明白了:) – Berkin

1

這是未定義的行爲

當你的編譯器在這裏預處理宏:

int y = ADD(++x); 

成爲

int y = (++x)+(++x); 

存在其中論點評估沒有特定的順序。

欲瞭解更多信息,請參閱Why are these constructs (using ++) undefined behavior?

+0

協處理器階段? – Peter

+0

@Peter謝謝你的建議。我做了更正。 – rsp

1

宏是不是真正的C++函數。這只是文字替換。

您的代碼:

int y = ADD(++x); 

被替換爲:

int y = (++x)+(++x); 

可以使用的,而不是宏觀的模板功能。

template<typename T1, typename T2> 
inline auto add(T1 x, T2 y) 
{ 
    return x + y; 
} 
+1

值得一提的是,'auto'返回類型是在C++ 14中引入的,並且不能在C++ 11模式下工作。 –

0

由於ADD(x)實際上是一個宏(而不是一個真正的功能),ADD(++x)計算結果爲(++x) + (++x)這是不是很好,因爲在所有該修改同一個變量,x,兩次在一個聲明。這種修改的結果是不確定的。

在你的編譯器的特定情況下,從2到3遞增x的值,然後增加它的3至4時,以執行(x+x)閱讀x的價值,它選擇閱讀最新值,是4.

我建議你閱讀宏和函數之間的區別。

相關問題