那么为什么 i = ++i + 1 在 C++11 中定义良好呢?

2024-04-12

我见过other https://stackoverflow.com/q/1860461/150634相似的问题 https://stackoverflow.com/q/4336860/150634并阅读defect http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#637关于它。但我还是不明白。为什么是i = ++i + 1在 C++11 中明确定义i = i++ + 1不是?标准如何对此进行明确定义?

通过我的锻炼,我有以下几点之前测序图(其中箭头表示之前排序的关系,除非另有说明,一切都是值计算):

i = ++i + 1
     ^
     |
assignment (side effect on i)
 ^      ^
 |      |
☆i   ++i + 1
     ||    ^
    i+=1   |
     ^     1
     |
★assignment (side effect on i)
  ^      ^
  |      |
  i      1

我已经标记了副作用i带有黑星和价值计算i与一颗白色的星星。这些似乎彼此之间没有顺序(根据我的逻辑)。标准说:

如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值的值计算是无序的,则该行为是未定义的。

中的解释是缺陷报告 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#637没有帮助我理解。左值到右值的转换有什么关系?我做错了什么?


...或值计算使用该值相同标量对象的...

重要的部分在这里加粗了。左侧不使用值i用于值计算。正在计算的是glvalue。仅在之后(顺序为之后),对象的值才会被触摸和替换。

不幸的是,这是一个非常微妙的点:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

那么为什么 i = ++i + 1 在 C++11 中定义良好呢? 的相关文章

随机推荐