cod*_*101 11 c++ pointers memory-address
#include <iostream>
using namespace std;
int main()
{
int x=80;
int &y=x;
cout<<"x"<<x<<" "<<"y"<<y++;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我以下输出:
81 80
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释一下x变化的价值如何81?yis 的值80然后会增加到81,但它是如何反映的x?
它是否反映因为y是参考变量?然后该值应该在两个已被修改x和y?
vso*_*tco 15
您具有不确定的行为,因为你的操作是连续两个之间的序列点(有函数参数的评估之间没有顺序点).您可以将序列点粗略地视为"时间"标记,并且在两个连续的标记之间不允许多次修改同一个变量.
基本上你的代码相当于
std::cout << x << x++; // undefined behaviour
Run Code Online (Sandbox Code Playgroud)
因为y它只是一个参考(别名)x.
1.9程序执行[intro.execution](强调我的)
14)每个值计算和副作用与全表达相关进行测序以评估与下一个全表达相关的每一个值的计算和副作用之前.
15)除非另有说明,否则对个体操作员的操作数和个别表达式的子表达式的评估是不确定的.[注意:在程序执行期间不止一次评估的表达式中,不需要在不同的评估中一致地执行对其子表达式的未序列和不确定顺序的评估. - 结束注释]在运算符的结果的值计算之前,对运算符的操作数的值计算进行排序.如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,并且它们不可能是并发的(1.10),则行为未定义.[注意:下一节对潜在的并发计算施加了类似但更复杂的限制.-endnote]
当调用函数时(无论函数是否为内联函数),与任何参数表达式相关联的每个值计算和副作用,或者使用指定被调用函数的后缀表达式,都会在执行每个表达式或语句之前对其进行排序.叫功能.[注意:与不同参数表达式相关的值计算和副作用未被排序. - 结束注释]调用函数(包括其他函数调用)中的每个评估(在执行被调用函数体之前或之后没有特别排序)在被调用函数的执行方面是不确定的顺序.9几个上下文在C++中导致函数调用的评估,即使在翻译单元中没有出现相应的函数调用语法.[示例:对new-expression的求值会调用一个或多个分配和构造函数; 见5.3.4.另一个例子,转换函数(12.3.2)的调用可能出现在没有出现函数调用语法的上下文中.
相关:https://stackoverflow.com/a/10782972/3093378