'x += x--' 后面的 x 是什么?
What is x after 'x += x--'?
执行下面的代码后发生了什么事;
int x = 10;
x += x--;
我期待结果 19(将 x 加到 x,然后将 x 减 1),但结果是 20。它在幕后是如何工作的?感谢您的回答。
这种情况下的行为在 C++17 之前是未定义的,参见例如 https://en.cppreference.com/w/cpp/language/eval_order#Undefined_behavior ,所以如果你的编译器不符合它,测试或试图理解它是没有用的:它会取决于实现,甚至是编译器的版本。
如果您的编译器符合 C++17,则可以保证在简单或复合赋值(分别为 =
或例如 +=
中)右侧的所有副作用将在评估左侧之前处理。
在你的情况下,x--
被评估为 10
伴随着设置 x=9
作为它的副作用,然后计算机将添加 10
到 x=9
导致 x=19
.
感谢 Michał 的更正,我将其纳入了答案。
使用较旧的 c++ 可能无法完成这项工作,因为根据较旧的标准,行为实际上被定义为未定义。 (感谢@LightnessRacesinOrbit)
如果你只是尝试一个有最新版本的在线编译器,它工作得很好,结果是你预期的 19(x+=x--
与 x= x+x--
相同。这意味着为了获得新的"x",它必须将旧的"x"+旧的"x" -1相加。所以它会做x+(x--)
,即x=10+(9)
。
试试看 here:
与:
#include <iostream>
using namespace std;
int main()
{
int x = 10;
x += x--;
cout<<x<<endl;
}
执行下面的代码后发生了什么事;
int x = 10;
x += x--;
我期待结果 19(将 x 加到 x,然后将 x 减 1),但结果是 20。它在幕后是如何工作的?感谢您的回答。
这种情况下的行为在 C++17 之前是未定义的,参见例如 https://en.cppreference.com/w/cpp/language/eval_order#Undefined_behavior ,所以如果你的编译器不符合它,测试或试图理解它是没有用的:它会取决于实现,甚至是编译器的版本。
如果您的编译器符合 C++17,则可以保证在简单或复合赋值(分别为 =
或例如 +=
中)右侧的所有副作用将在评估左侧之前处理。
在你的情况下,x--
被评估为 10
伴随着设置 x=9
作为它的副作用,然后计算机将添加 10
到 x=9
导致 x=19
.
感谢 Michał 的更正,我将其纳入了答案。
使用较旧的 c++ 可能无法完成这项工作,因为根据较旧的标准,行为实际上被定义为未定义。 (感谢@LightnessRacesinOrbit)
如果你只是尝试一个有最新版本的在线编译器,它工作得很好,结果是你预期的 19(x+=x--
与 x= x+x--
相同。这意味着为了获得新的"x",它必须将旧的"x"+旧的"x" -1相加。所以它会做x+(x--)
,即x=10+(9)
。
试试看 here: 与:
#include <iostream>
using namespace std;
int main()
{
int x = 10;
x += x--;
cout<<x<<endl;
}