【问题标题】:C++ infinite loop when assigning and post incrementing the loop iterator (gcc bug?) [duplicate]分配和后递增循环迭代器时的C ++无限循环(gcc错误?)[重复]
【发布时间】: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


【解决方案1】:

i = i++ 的行为是未定义(在一个无序的步骤中同时读写 - 并且在标准中 )。 从不使用它。

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

关于编译器错误的思考。找到一个也不是不可能,但不太可能,尤其是在可疑表情如此小的情况下。

【讨论】:

  • 有趣,我不知道!我会在以后的所有节目中记住这一点,哈哈。
  • FWIW, i = ++i 从 C++11 开始定义良好
  • 我认为他们应该随机更改每个新标准中定义的内容和未定义的内容来取笑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2016-10-20
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多