使用宏时出现意外结果

Unexpected result upon using macro

本文关键字:意外 结果      更新时间:2023-10-16

我试图运行一段代码。

#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。请有人帮助我了解这背后的逻辑。

宏只是文本替换。想想您的宏调用将产生什么:

int y = CUBE(++x);
// becomes
int y = (++x*++x*++x);

在序列点之间多次修改变量是未定义的行为(有关详细信息,请查找"序列点")。未定义的行为意味着该行为不可依赖。这是宏的危险之一。如果它是一个函数调用,它将按预期工作,因为那时++x只会被求值一次。

CUBE(++x)扩展到++x * ++x * ++x。最好将其定义为内联函数,而不是定义。类似于:

inline int CUBE( int x )
{
    return x * x * x;
}

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

您使用了宏,所以调用,

CUBE(++x)

被取代

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