分配和后期递增循环迭代器时发生C ++无限循环(gcc错误?)

时间:2018-09-27 15:45:12

标签: c++ for-loop gcc variable-assignment post-increment

前几天,我在一个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 ++标准正确地解释了这一问题?

1 个答案:

答案 0 :(得分:6)

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

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

关于编译器错误的思考。并非不可能,但是极其不太可能,特别是如果可疑的表情很小的话。