当我运行这段代码时,输出是 11, 10。
到底为什么会这样?有人可以给我一个解释,希望能启发我吗?
Thanks
#include <iostream>
using namespace std;
void print(int x, int y)
{
cout << x << endl;
cout << y << endl;
}
int main()
{
int x = 10;
print(x, x++);
}
The C++标准规定(第 1.9.16 节中的注释):
与不同参数表达式相关的值计算和副作用是无序的。
换句话说,在将参数的值传递到函数之前,参数的求值顺序是未定义的和/或依赖于编译器的。因此,在某些编译器(首先评估左侧参数)上,代码将输出10, 10
对于其他的(首先评估正确的参数)它将输出11, 10
。一般来说,您永远不应该依赖未定义的行为。
为了帮助您理解这一点,想象一下在调用函数之前对每个参数表达式进行求值,如下所示(这并不是它实际工作的方式,这只是一种简单的思考方式,可以帮助您理解排序):
int arg1 = x; // This line
int arg2 = x++; // And this line can be swapped.
print(arg1, arg2);
C++ 标准规定两个参数表达式是无序的。因此,如果我们像这样将参数表达式写在单独的行上,那么它们的顺序应该不重要,因为标准规定它们可以按任何顺序进行计算。一些编译器可能会按上述顺序评估它们,其他编译器可能会交换它们:
int arg2 = x++; // And this line can be swapped.
int arg1 = x; // This line
print(arg1, arg2);
这使得很明显如何arg2
可以保持价值10
, while arg1
保持该值11
.
您应该始终避免代码中出现这种未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)