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中的错误。