C ++“ operator + =“和“ operator ++”优先级问题

时间:2019-12-21 15:19:40

标签: c++

int a = 1;
a += ++a;
cout << a << endl; // 4
int a = 1;
a += a++;
cout << a << endl; // 3

为什么这两个例子有不同的行为?

6 个答案:

答案 0 :(得分:4)

  

警告:您正在查看的作业具有未定义的行为。参见Why are these constructs using pre and post-increment undefined behavior?   问题this answer中的Undefined behavior and sequence points也解决了C ++ 17如何解决这些问题。

您的编译器可能以以下方式处理这些操作,解释了不同之处:

预递增操作: 以下行:

a=2;
a+=++a;

也是等效的:

a=2;
tmp=++a;    
a+=tmp;

其内容为:

  1. 2分配给变量a
  2. 预先递增a++a),为a赋予值3,并将其分配给tmp(使其成为3)< / li>
  3. a(当前为3)的值增加为tmp(当前为3)的值,从而得到6

后递增操作: 以下行:

a=2;
a+=a++;

也是等效的:

a=2;
tmp=a++;    
a+=tmp;

其内容为:

  1. 2分配给变量a
  2. 后递增aa++)首先返回a(即2)的原始值,并将其分配给tmp(使其成为{ {1}}),然后将2递增到a的值
  3. 3(当前为a)的值增加为3(当前为tmp)的值,从而得到2

答案 1 :(得分:3)

a++++a做不同的事情。

a++a加1并返回先前的值。

++aa加1并返回新值。

答案 2 :(得分:0)

a++返回a 增量之前的值。 ++a返回之后a的值。 这就是为什么它们不同的原因。

答案 3 :(得分:0)

这里的区别不是三个运算符的优先级。紧跟this chart,其中a++> ++a> a+=

而是两个增量运算符的工作方式。当您使用++a时,您首先要递增,然后返回该值(新值)。使用a++时将首先使用旧值,然后递增。 Also see here for related.

答案 4 :(得分:0)

一元运算符评估首先发生。 先评估增量前,然后将其添加到左侧运算符,但增量后,增量将在添加后发生。

以下是规则: https://en.cppreference.com/w/cpp/language/operator_precedence

答案 5 :(得分:0)

  

使用:

a += a++;
  

您添加a的前一个值,然后将a加1

     

使用:

a += ++a;
  

您添加已经增加1的值