我对我找到的解释非常有信心,它说到在C++11中,
i = ++i
不是未定义的。但是,我无法判断i += ++i
的行为是否是明确定义的。有人愿意解答吗?i = ++i
不是未定义的。但是,我无法判断i += ++i
的行为是否是明确定义的。有人愿意解答吗?i = ++i
定义良好的推理同样可以用来证明i += ++i
必须也定义良好。
i += ++i
等同于i += (i += 1)
,新的排序规则要求在i += 1
子表达式的值计算之前进行赋值。这意味着表达式i += ++i
的结果必须与i = 2 * i + 1
相同。i += ++i
的行为是未定义的,因为子表达式i
(左侧参数)和++i
的值计算在彼此之间是无序的,并且其中一个包含对象i
的更新。i = ++i
不是问题,因为左侧的i
没有经历lvalue-to-rvalue转换,而在i += ++i
的情况下会发生这种情况。i = ++i
和i += ++i
之间的区别在于左侧i
的值计算,它与++i
的顺序不确定。这使得结果未定义。我会相应地更新我的答案。 - Bart van Ingen Schenau