#define ADD(x)(x)+(x)返回错误的结果

时间:2017-02-04 11:42:24

标签: c++

我有这个功能,它会为自己添加一个数字。

#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并且它正在向ADD函数发送3但看起来它似乎没有。有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:10)

您的程序有未定义的行为,因为您正在调用preincrement运算符两次: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 :(得分:1)

未定义的行为

当你的编译器在这里预处理宏时:

int y = ADD(++x);

它变成了

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

没有指定参数的指定顺序。

有关详细信息,请参阅Why are these constructs (using ++) undefined behavior?

答案 2 :(得分: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;
}

答案 3 :(得分:0)

由于ADD(x)实际上是一个宏(与实际函数相对),ADD(++x)的计算结果为(++x) + (++x),这根本不好,因为这会修改同一个变量x 1}},在一个陈述中两次。这些修改的结果是不确定的。

在编译器的特定情况下,它将x的值从2增加到3,然后从3增加到4.同时读取x的值以执行{{1} },它选择读取最新值,即4。

我建议您阅读宏与功能之间的差异。