代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

为什么i=++i+2是未定义的行为?[副本]

  •  3
  • Rick Jim DeLaHunt  · 技术社区  · 7 年前

    这个问题已经有了答案:

    我读过一些关于 估价顺序 我也理解一些由评估顺序引起的错误。

    我的基本规则来自文本和示例:

    • 操作数的计算顺序与优先级和关联性无关。
    • 在大多数情况下,订单基本上是未指明的。

    对于这样的表达: int i = f1() * f2();

    必须先调用f1和f2,然后才能进行乘法运算。毕竟,它们的结果是相乘的。然而,我们无法知道F1是在F2之前被调用,还是相反。

    未定义的行为示例:

    int i = 0;
    cout << i << " " << ++i << endl; 
    

    我如何理解:我对待 i ++i 作为一个函数。我不知道谁先评估,所以第一个 可以是 0 1 这条规则是有道理的。


    while(beg != s.end())
        *beg = toupper(*beg++);  //Just another example.
    

    我认为理解这一点的关键是将每个操作数视为一个“计算单元”,人们不知道这些单元中的计算顺序,但可以知道 每个单元 .

    但是为了 i = ++i + 2 reference here ,为什么是错的?我不能用自己的结论来解释。

    左边 用作 左值 不是指针 . ++我 只需重写原始值,而不更改存储地址。如果它先评估或后评估会有什么问题?我的规则在这里失效了。

    很长时间了,但尽量提供足够的背景信息,感谢您的耐心等待。


    我不知道 序列点 答案中经常提到。所以我想我需要先读一些关于它的东西。顺便说一句,辩论并不是很有帮助,因为新手只想知道为什么它被认为是错误的,比如C++ 11之前?


    我找到这个答案 Undefined behavior and sequence points 解释清楚为什么 I=++I+2 是C++ 11之前的未定义行为

    2 回复  |  直到 7 年前
        1
  •  4
  •   MSalters    7 年前

    ++i )副作用(写入新值)在进一步使用新的递增值之前进行排序。从任务开始 i= 在写入之前按可传递顺序排列 i=(++i + 2)

    i=(i++ + 2)

        2
  •  -3
  •   Bathsheba    7 年前

    你的两个“子功能”在 i = ++i + 2 = ++ 操作员。

    + 什么时候 i

    因此,最终值是否 old_i incremented plus 2 old_i incremented .