代码之家  ›  专栏  ›  技术社区  ›  tjwrona1992

分配和增量循环迭代器(GCC BUG)后的C++无限循环(复制)

  •  3
  • tjwrona1992  · 技术社区  · 6 年前

    前几天我在一个C++应用程序中遇到了一个奇怪的错误,它触发代码进入无限循环。在一场比赛结束时 for 循环,而不是仅仅递增 i++ i = i++ .

    for (int i = 0; i < 10; i = i++) {
        cout << "i = " << i << endl;
    }
    

    输出:

    i = 0
    i = 0
    i = 0
    ...
    

    最奇怪的是,即使理解这是一个打字错误,我也不明白为什么这个代码不能工作。据我所知,分配给 i 应该没有影响因为

    另一件有趣的事情是把作业改成 i = ++i 不会产生无限循环。

    此代码没有在我们以前的编译器上生成无限循环: gcc version 4.4.7 20120313 . 我们最近升级到 gcc version 4.8.5 20150623 现在它做到了。

    问题是,为什么当逻辑看起来不应该这样时,这个代码会产生无限循环,哪个编译器根据C++标准正确地解释这个循环?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Bathsheba    6 年前

    行为 i = i++ (在一个不连续的步骤中同时读写——以及 使用它。

    i = ++i

    至于从编译器错误的角度思考。你能找到一个不是不可能的,但这是不可能的 极其 不太可能,特别是如果可疑的表达是如此之小。