c++中对引用变量的修改
Alterations to reference variables in c++
#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
是一个引用变量?那么x
和y
的值应该都修改了吗?
你有未定义的行为,因为你的操作是在两个连续的序列点之间(函数参数计算之间没有序列点)。您可以将序列点视为"时间"标记,并且在两个连续的序列点之间,您不允许多次修改相同的变量。
基本上你的代码相当于
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
- 如何从子成员函数修改父公共成员变量
- 修改程序的入口点时未调用全局变量的构造函数
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如何使用gmock模拟修改C++类中私有变量的成员函数
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 我们如何修改常量变量的值
- 是否可以禁止在for循环体内部修改循环变量
- 使用 QtConcurrent::run() 修改成员变量?
- 在 C++17 中修改 constexpr 函数中的全局变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 如何修改用户指定的变量?
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 在击中断点并继续执行VS时,如何在运行时自动修改变量的值
- C 如何使DLL从主线程修改变量
- 使用gcc插件修改变量声明的顺序
- 从子 DLL 访问/修改变量
- QThread:从不同线程修改变量的安全方法
- C++继承子类可修改变量
- 由于在序列点之间修改变量两次而导致的 UB 是否会转移到"inner"范围?
- assert()修改变量时发出警告