【发布时间】:2019-03-03 14:05:17
【问题描述】:
前几天我在我们的一个 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++ 标准正确解释了这个?
【问题讨论】:
-
我知道这在很多方面都与规范的“UB 和序列点”重复(我今天已经敲定了一个),但是这个问题特别好。
-
@Bathsheba 有很好的重复要求是可以的。他们将作为未来搜索者的路标
-
@NathanOliver:是的,我倾向于同意。仅问题标题就非常易于搜索。已出现在 Google 中!
标签: c++ for-loop gcc variable-assignment post-increment