我有这个功能,它会为自己添加一个数字。
#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但看起来它似乎没有。有人可以向我解释一下吗?
答案 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。
我建议您阅读宏与功能之间的差异。