我不明白,为什么下面的程序的输出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;
究竟做了什么?
您正在触发未定义的行为,并且没有“正确的”答案。您的编译器可以选择以何种顺序来评估加号运算符的参数。
它看起来像++a
表达的其余部分之前评估,所以它仿佛a
是21`在一份声明中像
a += a + a;
在任何情况下,不要使用++a
算术表达式的内就像那样。这是人们困惑,并可能是不确定的行为
标准说:“的前面和后面的序列点之间的标量对象应具有其存储的值由表达式求值修改最多一次”(5表达式,§4),即如下:
a += a + ++a
得到未定义行为只是想:
a = ++a;
已经。它还说:如果你想改变a
“的前一个值是唯一的访问,以确定的值存储”,也就是说,你可以使用a
在同一个表达式只是为了找回以前的值:
a = a + 1; // OK
... “否则行为是未定义的。”
谢谢你,你的意思是说这个表达式可能会产生不可预测的结果,也就是说某时某个时候可能是21并且可能是某个时候20.你能否再详细解释 – user2747954
@ user2747954:未定义的行为通常意味着任何事情都可能发生。这种行为可能取决于你的编译器,你正在使用的环境......有时会导致代码在99.9%的情况下完美工作,使得等待0.1%的定时炸弹......如果你知道某些东西产生未定义的行为,***避免它***。 – LihO
这是很多SO问题的重复,我失去了数量(但似乎无法找到它们)。 –
也[此](http://stackoverflow.com/questions/11194530/where-do-sequence-points-come-from)。 – devnull
我想补充说:“请不要问为什么'i ++ ++ ++ i'的结果不符合您的预期。” –