分配和 post 递增循环迭代器时的 C++ 无限循环(gcc 错误?)

C++ infinite loop when assigning and post incrementing the loop iterator (gcc bug?)

前几天我在我们的一个 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 = ++i 不会产生无限循环。

这段代码在我们以前的编译器上没有产生无限循环:gcc version 4.4.7 20120313。我们最近升级到 gcc version 4.8.5 20150623,现在升级了。

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

i = i++ 的行为是 未定义(在未排序的步骤中同时读写 - 而 在标准中是 ). 从不使用它。

请注意 i = ++i 是从 C++11 定义的

至于从编译器错误的角度思考。找到一个并非不可能,但极不可能,尤其是在可疑表达式非常小的情况下。