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

tjw*_*992 3 c++ gcc for-loop variable-assignment post-increment

前几天我在我们的一个C++应用程序中遇到了一个奇怪的拼写错误,触发了代码进入无限循环.在for循环结束时i++,程序员意外地分配,而不是仅仅递增i = i++.

for (int i = 0; i < 10; i = i++) {
    cout << "i = " << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

i = 0
i = 0
i = 0
...
Run Code Online (Sandbox Code Playgroud)

最奇怪的是,即使理解这是一个错字,我也看不出为什么这段代码不起作用.据我所知,分配i应该没有影响,因为i在分配后仍应增加.(出于某种原因,它必须改为复制一份?但这似乎没有意义.)

另一个有趣的事情是将赋值更改为i = ++i不会产生无限循环.

这段代码在我们之前的编译器中没有产生无限循环:gcc version 4.4.7 20120313.我们最近升级到gcc version 4.8.5 20150623现在它.

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

Bat*_*eba 6

的行为i = i++未定义的(在未测序步骤同时读写-这在标准中).永远不要使用它.

请注意,这i = ++i 从C++ 11定义的.

至于编译器错误的思考.你找到一个并不是不可能的,但这是不可能的,特别是如果怀疑的表达如此之小.