在for循环内部使用时,是否存在任何异常甚至极端的情况,即后增量实际上比预增量更好

When using inside a for-loop, is there any exception or even extreme corner case that postincrement is actually better than preincrement?

本文关键字:情况 更好 实际上 内部 循环 for 是否 异常 任何 存在      更新时间:2023-10-16

考虑以下语句:

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 (int i = 0; i < 42; i++)

不是

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

我的猜测是,有些中世纪的语言只实现了i++,但没有实现++i,所以习惯这些语言的人会继续使用它们递增迭代器的方式,但我真的想知道这种约定是从哪里来的。

为了详细说明我的评论,类似的for循环

for (pre; cond; post) body

相当于下面的while环路

{
    pre
    while (cond)
    {
        body
        post
    }
}

正如您所看到的,post部分在while循环体内部时与for循环体是分开的。

通常后增量和前增量只在两个方面不同:它们返回不同的值,后增量稍微贵一点,因为它需要复制变量。返回值没有用在for循环中,所以如果我们想让post-比pre-更好,我们必须发明一个新的Container类,它的Iterator有一个奇怪且代价高昂的预增算子。类似的东西

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

这可能是简单无能的结果。至于在operator++()中放一些不好的东西的真正原因,我很困惑。

附言:我曾经有一个下属坚持认为后增量是正确的,在for循环中使用前增量会给出不同的(错误的)结果。一再纠正他也无济于事;事实上,他本可以很容易地检验这一假设,但这并没有什么区别。不知何故,他做了十多年的软件工程师,却一直不擅长