i+= ++是C ++ 0x中未定义的行为吗?
-
30-09-2019 - |
题
我对我发现的解释非常确信 i = ++i
不是不确定的 就C ++ 0x而言,我无法判断 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到RVALUE转换,这确实发生在 i += ++i
案子。
在旁注上:不要在任何严肃的项目中编写这样的代码。它过多地依赖于确切地了解测序规则,并且会有很多人不正确理解测序规则,而是没有意识到DR 637的结果的变化,或者因错过一些重要的重要性而被绊倒所讨论的表达的各个方面(就像我撰写此答案的第一个修订时发生的那样)。
不隶属于 StackOverflow