使用宏时意外的结果

时间:2014-04-12 05:35:24

标签: c++ macros

我试图运行代码。

#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。有人请帮我搞定逻辑。

3 个答案:

答案 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;
}

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

答案 2 :(得分:1)

您使用宏进行通话,

CUBE(++x)

替换为

++ X * ++ X * ++ X 所以输出不像你预测的那样 当您使用宏时,调用将被宏中定义的代码替换。