C++ 使用宏时出现意外结果

C++ 使用宏时出现意外结果,c++,macros,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; } #包括 #定义立方体(x)(x*x*x) 使用名称空间std; int main(){ int x=5; int y=立方体(++x); 你用了宏,所以电

我试着运行一个代码

#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;
}
#包括
#定义立方体(x)(x*x*x)
使用名称空间std;
int main(){
int x=5;
int y=立方体(++x);

你用了宏,所以电话

CUBE(++x)
被替换为

++x*++x*++x 因此,输出结果与您预测的不一样。

当您使用宏时,调用将替换为宏中定义的代码。

您使用宏,因此调用

CUBE(++x)
被替换为

++x*++x*++x 因此,输出结果与您预测的不一样。

使用宏时,调用将被宏中定义的代码替换。

宏只是文本替换。请考虑宏调用将产生什么:

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

在序列点之间多次修改变量是未定义的行为(有关详细信息,请查阅“序列点”).Undefined behavior(未定义的行为)意味着无法依赖该行为。这是宏的危险之一。如果它是函数调用,它将按预期工作,因为
++x
将只计算一次。

宏只是文本替换。请考虑宏调用将产生什么:

int y = CUBE(++x);
// becomes
int y = (++x*++x*++x);
在序列点之间多次修改变量是未定义的行为(有关详细信息,请查阅“序列点”)。未定义的行为意味着无法依赖该行为。这是宏的危险之一。如果它是函数调用,它将按预期工作,因为
++x
将只计算一次。

多维数据集(++x)
扩展为
++x*++x*++x
。最好将其定义为一个内联函数,而不是定义函数。例如:

inline int CUBE( int x )
{
    return x * x * x;
}
CUBE(++x)
扩展为
++x*++x*++x
。最好将其定义为一个内联函数,而不是定义。类似于:

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

这是未定义的行为。查看预处理的输出,您就可以定义多维数据集(x)((x)*(x)*(x))
int y=CUBE(x+1)这个函数的定义将使你得到请求的216.5,也许在一个POST中获得最有用的标题。你的问题是标记C++,所以请你,天哪,除非这是一个练习,用内联函数来解决这个问题!它是未定义的行为。查看预处理的输出。t,定义立方体(x)((x)*(x)*(x))
inty=CUBE(x+1)请把C++定义为一个函数,你的问题是标记为C++,所以,请不要这样,老天爷,除非这是一个练习,否则用内联函数来解决这个问题!<代码> ++i,++i;< /COD>或<代码> +I+i++i不是未定义的行为,所以您应该说,“在序列点中多次修改变量是”(语句-->序列点)@GrijeshChauhan懒惰的措辞。我已经改变了它。谢谢。@Grijesh,这些是C++98的规则。在C++11中,排序规则都改变了,现在变得非常复杂。例如,
I=++I+1;
现在定义得很好(不要让我解释,但我读了一篇关于它的文章)“MattMcNabb Thanks MaTT!我已经超过10年了,我没有使用C++。我不知道C++ 98, 11。但是我会读它…祝你好运:我希望有人会写一篇详细的,好的文章来讨论整个话题。<代码> ++i,++i;< /COD>或<代码> +I+i++i不是未定义的行为,所以你应该说,“在序列点中多次修改变量是”(语句-->序列点)@GrijeshChauhan懒散的措辞。我已经更改了它。谢谢。@Grijesh,这些是C++98的规则。在C++11中,用于排序的规则都更改了,现在变得非常复杂。例如,
I=++I+1;
现在已经定义好了(别让我解释,但我读了一个关于它的帖子)。“MattMcNabb Thanks MaTT!我已经超过10年了,我没有使用C++。我不知道C++ 98, 11。但是我会读它…祝你好运:我希望有人能写一篇详细的,好的文章来讨论整个话题。