-6

我不明白为什么以下程序的输出是63

#include <iostream>

int main() {
  int a = 20;
  a += a + ++a;
  std::cout << a;
} 

我期待它是61。究竟是a += a + ++a;做什么的?

4

3 回答 3

3

标准说:“在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次”5个表达式,§4),即以下内容:

a += a +  ++a 

产生未定义的行为,就像:

a = ++a;

已经做了。它还说:“只能访问先前的值以确定要存储的值”,即如果要更改a,可以a在同一表达式中使用以检索先前的值:

a = a + 1; // OK

... “否则行为未定义。”

于 2013-09-26T17:03:18.500 回答
1

您正在触发未定义的行为,并且没有“正确”的答案。您的编译器可以选择评估加号运算符的参数的顺序。

于 2013-09-26T17:01:20.463 回答
0

它看起来像是++a在表达式的其余部分之前进行评估,所以好像a是 21` 在类似的语句中

a += a + a;

无论如何,不​​要++a在这样的算术表达式中使用。这让人们感到困惑,并且可能是未定义的行为

于 2013-09-26T17:02:36.430 回答