在 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是一个引用变量?那么应该在xy中都修改了值?

你有未定义的行为,因为你的操作是在两个连续的 sequence points 之间(函数参数评估之间没有序列点)。您可以粗略地将序列点视为 "temporal" 标记,并且在两个连续的标记之间,您不允许多次修改同一变量。

基本上你的代码等同于

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

因为 y 只是 x 的参考(别名)。

1.9程序执行[intro.execution](强调我的)

14) Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.

15) Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced. [ Note: In an expression that is evaluated more than once during the execution of a program, unsequenced and indeterminately sequenced evaluations of its subexpressions need not be performed consistently in different evaluations. — end note ] The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, and they are not potentially concurrent (1.10), the behavior is undefined. [ Note: The next section imposes similar, but more complex restrictions on potentially concurrent computations. —endnote]

When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function. [ Note: Value computations and side effects associated with different argument expressions are unsequenced. — end note ] Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function.9 Several contexts in C++ cause evaluation of a function call, even though no corresponding function call syntax appears in the translation unit. [ Example: Evaluation of a new-expression invokes one or more allocation and constructor functions; see 5.3.4. For another example, invocation of a conversion function (12.3.2) can arise in contexts in which no function call syntax appears.

相关: