使用宏时出现意外结果
Unexpected result upon using macro
我试图运行一段代码。
#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所以输出并不像你预测的那样
使用宏时,调用将被宏中定义的代码所替换。
相关文章:
- 尝试将字符串/字符转换为整数会产生意外结果
- RapidXML - 代码创建意外结果
- 类中静态函数C++意外结果
- 指针数组中的意外结果
- 使用指针访问数组元素时出现意外结果
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- C++:比较运算符>和字符串文本的意外结果
- 具有意外结果的 C++ 闭包
- yaml-cpp 比较的意外结果
- 每次都出现意外结果
- 在 Qt 中解析嵌套的 JSON 时出现意外结果(数组不存在)
- 如何避免 std::abs 的意外结果?
- 使用嵌套 if 语句的意外结果
- A ^= B ^= A ^= B;C# Visual Studio 中的意外结果
- 逻辑错误,我将获得意外结果
- 在 c++ 中使用异步的意外结果
- 从函数的返回值将元素C++存储到 std::vector 中时出现意外结果
- 执行递增和递减时"cout"链接会产生意外结果
- OpenCL - 内核方法返回意外结果
- C++使用 std::get_time 解析 YYMMDD ISO 8601 日期字符串会得到意外结果