c++中对引用变量的修改

Alterations to reference variables in c++

本文关键字:修改 变量 引用 c++      更新时间:2023-10-16
#include <iostream>
using namespace std;
int main()
{
    int x=80;
    int &y=x;
    cout<<"x"<<x<<" "<<"y"<<y++; 
    return 0;
}

上面的代码给出了以下输出:

81 80

谁能解释一下x的值是如何变化到81的? y的值是80,后来增加到81,但是它在x中是如何反映的?

是否反映因为y是一个引用变量?那么xy的值应该都修改了吗?

你有未定义的行为,因为你的操作是在两个连续的序列点之间(函数参数计算之间没有序列点)。您可以将序列点视为"时间"标记,并且在两个连续的序列点之间,您不允许多次修改相同的变量。

基本上你的代码相当于

std::cout << x << x++; // undefined behaviour

因为y只是x的引用(别名)。

1.9程序执行(强调我的)

14)每个值计算副作用与a相关全表达式在每次值计算和操作之前进行排序与下一个要计算的完整表达式相关联的效果。

15)除特别说明外,单个操作数的求值单个表达式的子表达式的操作符和unsequenced。[注意:在一次以上求值的表达式中在程序执行过程中,未排序的和不确定的不需要执行其子表达式的顺序求值在不同的评估中保持一致。-结束说明]取值操作符的操作数的计算顺序在运算结果的值计算。<strong的另一个副作用是未排序的的值进行相同的标量对象或值计算同一个标量对象,并且它们不是潜在并发的(1.10),行为是未定义的。>[注:下一节施加类似的,但是对潜在并发计算的更复杂的限制。尾注)

调用函数时(无论该函数是否内联)与任何参数相关的值计算和副作用表达式,或者使用指定被调用对象的后缀表达式函数,在执行每个表达式或之前进行排序语句在被调用函数体中。[注:价值与不同参数相关的计算和副作用表达式是无序的。的每一次评估调用不是的函数(包括其他函数调用)的执行之前或之后进行特定排序被调用函数体的顺序不确定被调用函数的执行c++中的几个上下文导致函数调用的求值,即使没有对应的函数调用语法出现在翻译单元中。(例子:new-表达式的求值调用一个或多个分配和构造函数;5.3.4见。的调用转换函数(12.3.2)可能出现在没有出现函数调用语法

相关:https://stackoverflow.com/a/10782972/3093378