0

考虑以下陈述:

for (Container<Object>::Iterator it = container.begin(); it != container.end(); it++) {
    *loop_content*
}

对比

for (Container<Object>::Iterator it = container.begin(); it != container.end(); ++it) {
    *loop_content*
}

据我了解,无论 *loop_content* 是什么,当在上面示例的 for 循环中使用时,前增量版本保证不会比后增量版本差。是否有任何例外甚至极端的极端情况使该陈述不再正确并且使后增量实际上比前增量更好

如果不是这样,这是我多年来一直想知道的稍微偏离主题的第二个问题:为什么很多教科书都在教人们使用 for-loop,例如:

for (int i = 0; i < 42; i++)

不是

for (int i = 0; i < 42; ++i)

我的猜测是,有些中世纪的语言只有 i++ 而没有 ++i 实现,所以习惯了这些语言的人会坚持他们递增迭代器的方式,但我真的很想知道这个约定是从哪里来的。

4

2 回答 2

2

为了详细说明我的评论,for像这样的循环

for (pre; cond; post) body

相当于下面的while循环

{
    pre

    while (cond)
    {
        body
        post
    }
}

如您所见,在循环体post内部的部分与while循环体是分开的for

于 2013-06-27T01:43:29.420 回答
1

通常后增量和前增量仅在两个方面有所不同:它们返回不同的值,并且后增量稍微昂贵一些,因为它需要制作变量的副本。返回值不会在for循环中使用,所以如果我们希望 post- 比 pre- 更好,我们必须发明一个新Container类,它Iterator有一个奇怪且昂贵的 pre-increment 运算符。就像是

operator++()
{
  ptr = ptr->next;
  // perform some undefined behavior, or just hash the Beijing telephone book
  return *this;
}

这可以作为简单无能的结果来完成。至于把坏东西放进去的真正原因operator++(),我很难过。

PS我曾经有一个下属坚持认为后增量是正确的,并且在for循环中使用前增量会产生不同(错误)的结果。反复纠正他没有帮助;他可以很容易地检验这个假设这一事实没有任何区别。他不知何故做了十多年的软件工程师,却没有精通它。

于 2013-06-27T01:56:20.277 回答