在for循环内部使用时,是否存在任何异常甚至极端的情况,即后增量实际上比预增量更好
When using inside a for-loop, is there any exception or even extreme corner case that postincrement is actually better than preincrement?
考虑以下语句:
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
循环中使用前增量会给出不同的(错误的)结果。一再纠正他也无济于事;事实上,他本可以很容易地检验这一假设,但这并没有什么区别。不知何故,他做了十多年的软件工程师,却一直不擅长
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- 指针与参考示例,在什么情况下更好
- 在这种情况下,是否有更好的替代方法
- 在这种情况下,将数据存储在诸如SQLite之类的数据库中,还是存储在平面文本文件中更好
- 在这种情况下更好的是内联功能的宏
- 对于以下情况,哪一个是更好的stl映射或undered_map
- 有没有更好的方法在没有虚拟功能的情况下切换功能
- if/else在哪个阶段比switch情况更好?做到了
- 基本STL:向量列表或列表向量,在这种特殊情况下哪个会更好
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)
- CPP 建议更好的方法在没有开销/IO 调用的情况下进入静音状态
- 在我的情况下更好的是:矢量或列表
- 更好地理解makefile——在这种情况下如何生成.o文件
- 在for循环内部使用时,是否存在任何异常甚至极端的情况,即后增量实际上比预增量更好
- 在不使用文字的情况下检测负数的更好方法是什么?
- Swap() 函数的什么实现更好,适用于什么情况