我非常确信我已经发现说到i = ++i
is not undefined就C ++ 0x而言,但是我无法判断i += ++i
的行为是否是定义明确与否。任何人?
答案 0 :(得分:9)
使 i = ++i
定义良好的推理同样可以用来证明i += ++i
也必须明确定义。
<{{1>}等同于 i += ++i
,新的排序规则要求在i += (i += 1)
子表达式的值计算之前进行赋值。
这意味着表达式i += 1
的结果必须与i += ++i
的结果相同。
编辑:我必须修改我的答案,因为行为未定义。
i = 2 * i + 1
的行为未定义,因为子表达式i += ++i
(左侧参数)和i
的值计算相对于彼此和其中一个未被排序包含对象++i
的更新。
对于表达式i
,这不是问题,因为左侧的i = ++i
没有进行左值到右值的转换,这在{{1案件。
旁注:不要在任何严肃的项目中编写此类代码。它过分依赖于完全了解排序规则,并且会有许多人不能正确理解排序规则,不知道DR 637导致的规则变化或因缺少一些重要而被绊倒有问题的表达方面(在撰写本答案的第一个修订版时发生在我身上)。