我试图运行代码。
#include<iostream>
#define CUBE(x)(x*x*x)
using namespace std;
int main(){
int x=5;
int y=CUBE(++x);
cout<<y<<endl;
return 0;
}
根据我的说法,它的输出应该是216,但令人惊讶的是它的输出结果是392。有人请帮我搞定逻辑。
答案 0 :(得分:2)
宏只是文本替代品。想想你的宏调用会产生什么:
int y = CUBE(++x);
// becomes
int y = (++x*++x*++x);
在序列点之间多次修改变量是未定义的行为(查找&#34;序列点&#34;详细信息)。未定义的行为意味着不能依赖行为。这是宏的危险之一。如果它是一个函数调用,它将按预期工作,因为++x
只会被评估一次。
答案 1 :(得分:2)
CUBE(++x)
扩展为++x * ++x * ++x
。可能更好地将其定义为内联函数而不是定义。类似的东西:
inline int CUBE( int x )
{
return x * x * x;
}
答案 2 :(得分:1)
您使用宏进行通话,
CUBE(++x)
替换为
++ X * ++ X * ++ X 所以输出不像你预测的那样 当您使用宏时,调用将被宏中定义的代码替换。