我不明白为什么以下程序的输出是63
:
#include <iostream>
int main() {
int a = 20;
a += a + ++a;
std::cout << a;
}
我期待它是61
。究竟是a += a + ++a;
做什么的?
我不明白为什么以下程序的输出是63
:
#include <iostream>
int main() {
int a = 20;
a += a + ++a;
std::cout << a;
}
我期待它是61
。究竟是a += a + ++a;
做什么的?
标准说:“在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次”(5个表达式,§4),即以下内容:
a += a + ++a
产生未定义的行为,就像:
a = ++a;
已经做了。它还说:“只能访问先前的值以确定要存储的值”,即如果要更改a
,可以a
在同一表达式中使用以检索先前的值:
a = a + 1; // OK
... “否则行为未定义。”
您正在触发未定义的行为,并且没有“正确”的答案。您的编译器可以选择评估加号运算符的参数的顺序。
它看起来像是++a
在表达式的其余部分之前进行评估,所以好像a
是 21` 在类似的语句中
a += a + a;
无论如何,不要++a
在这样的算术表达式中使用。这让人们感到困惑,并且可能是未定义的行为