C++ x在'之后是什么;x+;=x--';?

C++ x在'之后是什么;x+;=x--';?,c++,operators,post-increment,C++,Operators,Post Increment,执行下面的代码后发生了什么 int x = 10; x += x--; 我期望的结果是19(将x与x相加,然后将x减少1),但结果是20。它在窗帘后面是如何工作的?感谢您的回答。本例中的行为在C++17之前是未定义的,请参阅,例如,因此,如果您的编译器不符合它,那么测试或试图理解它是没有用的:它将取决于实现,甚至取决于编译器的版本 如果您的编译器符合C++17,则可以保证在简单或复合赋值(分别为=或例如+=)中,在评估左手侧之前,会处理右手侧的所有副作用 在您的情况下,x--被评估为10,并将

执行下面的代码后发生了什么

int x = 10;
x += x--;

我期望的结果是19(将x与x相加,然后将x减少1),但结果是20。它在窗帘后面是如何工作的?感谢您的回答。

本例中的行为在C++17之前是未定义的,请参阅,例如,因此,如果您的编译器不符合它,那么测试或试图理解它是没有用的:它将取决于实现,甚至取决于编译器的版本

如果您的编译器符合C++17,则可以保证在简单或复合赋值(分别为
=
或例如
+=
)中,在评估左手侧之前,会处理右手侧的所有副作用

在您的情况下,
x--
被评估为
10
,并将
x=9
设置为其副作用,然后计算机将
10
添加到
x=9
中,从而产生
x=19


感谢Michał的更正,我将其纳入了答案。

本例中的行为在C++17之前是未定义的,例如,请参见,因此,如果您的编译器不符合它,那么测试或试图理解它是没有用的:它将取决于实现,甚至取决于编译器的版本

如果您的编译器符合C++17,则可以保证在简单或复合赋值(分别为
=
或例如
+=
)中,在评估左手侧之前,会处理右手侧的所有副作用

在您的情况下,
x--
被评估为
10
,并将
x=9
设置为其副作用,然后计算机将
10
添加到
x=9
中,从而产生
x=19


感谢米莎的修正,我把它纳入了答案。

有一个较老的C++可能不会做的行为,因为行为被字面定义为未定义的,由旧的标准。(感谢@LightnessRacesinOrbit)

如果你只是试用一个最新版本的在线编译器,它运行得很好,结果是19,正如你所期望的那样(
x+=x--
x=x+x--
相同。这意味着要得到新的“x”,它必须将旧的“x”和旧的“x”-1相加。因此它可以做到
x+(x--)
,也就是
x=10+(9)

试一试: 与:

#包括
使用名称空间std;
int main()
{
int x=10;
x+=x--;

CUT

有一个较旧的C++可能不做的行为,因为行为被字面定义为未定义的,由旧的标准。(由于@ LexNeasraceSin轨道)< /P> 如果你只是试用一个最新版本的在线编译器,它运行得很好,结果是19,正如你所期望的那样(

x+=x--
x=x+x--
相同。这意味着要得到新的“x”,它必须将旧的“x”和旧的“x”-1相加。因此它可以做到
x+(x--)
,也就是
x=10+(9)

试一试: 与:

#包括
使用名称空间std;
int main()
{
int x=10;
x+=x--;

你为什么还要写这样的代码呢?结果我得到了19个。@Cepheus在clang、gcc和MSVC上都是一样的:这是未定义的行为。你可能会得到19个,但不能保证。gcc将为
int main(){int x=10;x+=x--;}报告“警告:未排序的修改和对'x'[-Wunsequenced]”的访问
@Stephane否决票的目的是将答案标记为不正确。此处否决的所有答案(以及现在删除的答案)我们错了。你的努力得不到分数;你写正确的答案得不到分数。你为什么还要写这样的代码?结果我得到了19分。@Cepheus在clang、gcc和MSVC上也一样:这是未定义的行为。你可能会得到19分,但不能保证。gcc将报告“警告:未排序的修改和对'x'的访问”[-Wunsequenced]“对于
int main(){int x=10;x+=x--;}
@Stephane,否决票的目的是将答案标记为不正确。所有在此处被否决的答案(以及现在被删除的答案)都是错误的。你的努力得不到分数;写正确答案得分数。“可能无法处理它”不正确的是,行为被定义为未定义,由[旧]标准。它不是编译器的限制,而是C++如何被指定。好的,谢谢你的纠正!我马上就编辑答案!@ LeNESSEraceSin轨道“可能无法处理它”。不正确的是,行为被定义为未定义,由[旧]标准。它不是编译器的限制,而是C++如何被指定。好的,谢谢你的纠正!我马上就编辑答案。
#include <iostream>

using namespace std;

int main()
{
    int x = 10;
    x += x--;
    cout<<x<<endl;
}