c ++中的运算符优先级和运算符关联性规则

时间:2013-09-26 16:59:37

标签: c++ increment pre-increment computation

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

#include <iostream>

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

我原以为61。究竟a += a + ++a;究竟是什么?

3 个答案:

答案 0 :(得分:3)

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

a += a +  ++a 

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

a = ++a;

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

a = a + 1; // OK

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

看起来++a正在表达式的其余部分之前进行评估,所以就好像{/ 1}}在

之类的语句中是21`
a

无论如何,不​​要在算术表达式中使用a += a + a; 。这对人们来说很困惑,可能是未定义的行为