分配和 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 定义的 。
至于从编译器错误的角度思考。找到一个并非不可能,但极不可能,尤其是在可疑表达式非常小的情况下。
前几天我在我们的一个 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 定义的 。
至于从编译器错误的角度思考。找到一个并非不可能,但极不可能,尤其是在可疑表达式非常小的情况下。