回答一些评论,这是未定义的行为根据标准。看到这一点,编译器被允许做任何事情,包括格式化你的硬盘驱动器。
参见例子 这里的评论。问题的关键不在于你能看到对某些行为存在一种可能的合理预期。由于 C + + 标准和序列点的定义方式,这行代码实际上是未定义的行为。
例如,如果我们在上面的行之前有 x = 1,那么之后的有效结果是什么?有人评论说应该是
X 增加1
所以我们应该看到 x = = 2。然而,这实际上并不正确,您会发现一些编译器后面有 x = = 1,或者甚至 x = = 3。您必须仔细查看生成的程序集,以了解为什么会出现这种情况,但差异是由潜在的问题造成的。本质上,我认为这是因为编译器允许按照它喜欢的顺序计算两个赋值语句,所以它可以先执行 x++,或者先执行 x =。