c++ - 为什么for循环中的 "++i"和 "i++"有区别?

标签 c++ c post-increment pre-increment

我觉得

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

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

不应该做同样的事情。对于第二个例子,从循环开始 i 应该等于 1 对我来说更符合逻辑。

最佳答案

在一些处理器上,例如 PDP-11、VAX-11 和 68K,有些指令的模式相当于 *ptr++*--ptr。根据代码编写的确切方式,编译器使用这些指令可能容易也可能不容易 - 因此,使用 *++ptr* 的“正确”变体ptr++ [哪个更好取决于实际循环中的用法] 在这些特定情况下,循环内部可以在性能上产生相当大的差异。然而,对于 ARM 和 x86(我认为,PowerPC 和 MIPS,因此涵盖了几乎所有现代处理器),这种类型的构造无论如何都不是指令集的一部分,而且现在的编译器比以前聪明得多,比如说,10 或 20 年前。

任何合理的编译器都会对基本类型做同样的事情,i++++i 不是问题。

如果我们有一个“复杂”的类型,例如一个结构或类有一个 operator++(int),和 opterator++() 可能会有一个小的区别 [或者在极端情况下,差异很大],因为必须复制对象。假设我们有一个 bigmath 类,我们的 i 是一个 1000 位的长值。现在我们必须在增量的中间制作一个(n 个额外的)1000 位数字的拷贝。如果编译器能够“理解”正在发生的事情,它可能会删除该拷贝,但不能保证会发生。

关于c++ - 为什么for循环中的 "++i"和 "i++"有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16907391/

相关文章:

c - 后置自增运算符能保证立即运行吗?

c# - arr[0]++ 和++arr[0] 的区别

c++ - C/C++ 后置递增不止 1

c++ - OpenBLAS 仅为一个例程设置线程数

c - 在c中使用gawk

c++ - 我的 Linux 开发项目的 Clang vs GCC

c - 为什么位为 01110011 的字节不会变成字符 `s` ?

javascript - Node 的 C++ 附加组件,非阻塞?

C++:处理字节

c++ - 如何在 OpenGl 中计算三角形网格的顶点法线?