使用更改此变量的函数在同一行中打印引用变量
print reference variable in the same line with function that changes this variable
假设我们有函数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;
存储在表达式后半部分的x
和y
中的值可以在调用g
之前、之后或之间读取。
请注意,g
参数列表中y
的表达式不读取存储的值:y
是直接绑定到左值引用函数参数的左值,因此没有左值到右值的转换。
对g
的调用具有以下行为,其中x
和y
引用main
中的变量:
- 首字母:
x = 5, y = 2
. - 内部调用后
g
:x = 5, y = 7
(调用返回13
)。 - 外部调用后
g
:x = 5, y = 20
(调用返回34
)。
所以输出将以34 5
开头,但最后一个数字可以是2
、7
或20
。这称为未指定行为。
自 C++17 以来,<<
链的操作数从左到右排序;现在唯一可能的输出是34 5 20
。
注意:一些评论声称存在未定义的行为,但事实并非如此。 在 C++03 术语中,函数调用的进入和退出有一个序列点; 函数中y
的修改与main
中y
的读取由其中一个序列点分开。在C++11中,排序相同,但术语发生了变化。请参阅此处的第 11 点。
相关文章:
- 在C++的一行中初始化多个变量
- 将字符串存储到文件下一行的变量中
- 一行输入到多个变量
- 使用更改此变量的函数在同一行中打印引用变量
- 如何从文本文件中读取一行并将其分为不同的变量
- 如何在一行中从不同的变量(数据类型)创建一个字符数组?
- 如何在同一行中使用具有多个变量的 getline()
- 创建一个字符串变量,并在同一行上要求输入
- 引用变量在下一行程序执行后显示未找到的行为
- c++从ifstream中读取一行的最后一个变量
- 如何将一行数字读入不同的变量
- 从.txt文件中读取一行,然后插入变量
- 无法删除 txt 文件中 getline(cin , (变量)) 之后的下一行
- 将一行文件读入对象中的两个变量
- 我如何在同一行输入2个不同的变量,同时使用setw进行格式化
- 如何解析一行上变量数量未知的文本文件?
- 在一行中初始化多个私有变量
- c++读取文件,将每一行放入数组,对每个变量做一些操作
- 在C++中,你能在同一行声明多个引用变量吗
- 在c++中对齐(格式化)输出//多个变量在一行中