i + = ++我在C ++ 0x中的未定义行为吗?

时间:2010-10-14 10:42:08

标签: c++ c++11 undefined-behavior compound-assignment

我非常确信我已经发现说到i = ++i is not undefined就C ++ 0x而言,但是我无法判断i += ++i的行为是否是定义明确与否。任何人?

1 个答案:

答案 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导致的规则变化或因缺少一些重要而被绊倒有问题的表达方面(在撰写本答案的第一个修订版时发生在我身上)。