int a = 1;
a += ++a;
cout << a << endl; // 4
int a = 1;
a += a++;
cout << a << endl; // 3
为什么这两个例子有不同的行为?
答案 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;
其内容为:
2
分配给变量a
a
(++a
),为a
赋予值3
,并将其分配给tmp
(使其成为3
)< / li>
a
(当前为3
)的值增加为tmp
(当前为3
)的值,从而得到6
后递增操作: 以下行:
a=2;
a+=a++;
也是等效的:
a=2;
tmp=a++;
a+=tmp;
其内容为:
2
分配给变量a
a
(a++
)首先返回a
(即2
)的原始值,并将其分配给tmp
(使其成为{ {1}}),然后将2
递增到a
的值3
(当前为a
)的值增加为3
(当前为tmp
)的值,从而得到2
答案 1 :(得分:3)
a++
和++a
做不同的事情。
a++
将a
加1并返回先前的值。
++a
将a
加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的值