c++ - 在函数参数中使用后增量

标签 c++

当我运行这段代码时,输​​出是 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/

相关文章:

c++ - cin.get() 空行问题

c++ - 更好地设计具有继承性的 Db 抽象

c++ - "#include <iostream>"有什么作用?

c++ - 循环数组(队列)迭代器

c++ - Qt C++ 中对库方法的 undefined reference

c++ - 创建具有基于字符串的类型的多态 C++ 对象的最佳方法?

c++ - Boost::graph 未定义属性

c++ - 将数组元素移动 n 个位置

c++ - 在 C++ 中迭代链表比在 Go 中慢

c++ - 如何修复 Element <PrecompiledHeader> 在 C++ 中有无效值 "/Yu"错误?