当我运行这段代码时,输出是 11、10。
到底为什么会这样?有人可以给我解释一下,希望能启发我吗?
谢谢
#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++);
}
最佳答案
C++ standard状态(第 1.9.16 节中的注释):
Value computations and side effects associated with the different argument expressions are unsequenced.
换句话说,在将参数的值传递给函数之前,参数的计算顺序是未定义的和/或依赖于编译器的。因此,在某些编译器(首先评估左参数)上,代码将输出 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
,而 arg1
可以保存值 11
.
您应该始终在代码中避免这种未定义的行为。
关于c++ - 在函数参数中使用后增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11060968/