使用更改此变量的函数在同一行中打印引用变量

print reference variable in the same line with function that changes this variable

本文关键字:变量 一行 引用 打印 函数      更新时间:2023-10-16

假设我们有函数g:

int g(int x, int& y)
{
y = y + x++;
return x + y;
}

和主要功能:

int main()
{
int x = 5;
int y = 2;
cout << g(g(x, y), y) << ' ';
cout << x << ' ' << y << endl;
}

它打印预期结果:

34 5 20

但是当我重写 main 时:

int main()
{
int x = 5;
int y = 2;
cout << g(g(x, y), y) << ' ' << x << ' ' << y << endl;
}

它打印

34 5 2

有人可以解释一下为什么我们在这两种情况下有不同的行为吗?

在 C++17 之前,在行中:

cout << g(g(x, y), y) << ' ' << x << ' ' << y << endl;

存储在表达式后半部分的xy中的值可以在调用g之前、之后或之间读取。

请注意,g参数列表中y的表达式不读取存储的值:y是直接绑定到左值引用函数参数的左值,因此没有左值到右值的转换。

g的调用具有以下行为,其中xy引用main中的变量:

  • 首字母:x = 5, y = 2.
  • 内部调用后gx = 5, y = 7(调用返回13)。
  • 外部调用后gx = 5, y = 20(调用返回34)。

所以输出将以34 5开头,但最后一个数字可以是2720。这称为未指定行为

自 C++17 以来,<<链的操作数从左到右排序;现在唯一可能的输出是34 5 20


注意:一些评论声称存在未定义的行为,但事实并非如此。 在 C++03 术语中,函数调用的进入和退出有一个序列点; 函数中y的修改与mainy的读取由其中一个序列点分开。在C++11中,排序相同,但术语发生了变化。请参阅此处的第 11 点。