C++ 为什么递增并赋值给引用,而不是更改值?

C++ 为什么递增并赋值给引用,而不是更改值?,c++,reference,C++,Reference,我无法理解,为什么代码的输出不是我所期望的 #include <iostream> using namespace std; int main() { int m = 2, n = 6; int &x = m; int &y = n; m = x++; x = m++; n = y++; y = n++; cout<< m << " " << n;

我无法理解,为什么代码的输出不是我所期望的

#include <iostream>
using namespace std;
int main()
{
    int m = 2, n = 6;
    int &x = m;
    int &y = n;
    m = x++; 
    x = m++;
    n = y++;
    y = n++;
    cout<< m << " " << n; 
    return 0; 
}
#包括
使用名称空间std;
int main()
{
int m=2,n=6;
int&x=m;
int&y=n;
m=x++;
x=m++;
n=y++;
y=n++;

注意操作符是如何在增量后而不是增量前进行的……基本上你什么都没做

m=x++;
意味着递增x(即m),但返回x(即m)的旧值。赋值发生在递增和返回旧值之后,旧值就是最终被赋值的值。因此,基本上你会得到一堆自赋值。

这一行:

m = x++; 
相当于:

x = x++;
因为
m
是对
x
的引用

从c++17开始,首先计算右侧,结果是2。然后将
x
增加到3。然后将右侧值赋值给左侧。但这使用了右侧的旧值,即2。因此上述语句实际上没有任何作用

在c++17之前

m = x++;

是未定义的行为。

听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看它与预期的偏差。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:既然
x
,请参考nce到
m
这一行
m=x++;
m=m++;
相同,这是未定义的行为。@我想MarekR不是从c++17来的。Clangs undefined behavior sanitizer没有发现任何MSVC给出的不同答案检查我的知识:在c++17之前,它是未定义的,因为赋值和增量都是按顺序排列的返回后,但没有相互排序?@Frodyne非常有用。这里有一个有用的例子详细介绍了这一点。我在我的机器上使用msvc运行了这段代码,使用开关
/std:c++14
它生成
48
,对于
/std:c++17
它生成结果
26
。@cigien我知道,这只是实验证明。无论如何,在构建过程中,这应该失败(它是带有UB的C++14 constexpr):.
constexpr
应该是UB自由的。如果UB出现在
constexpr
中,编译器应该提交一个错误。所以这肯定是msvc中的错误。