【发布时间】:2013-11-13 20:23:25
【问题描述】:
我有一个关于编写循环的问题。我总是从
(int i=0; i<10; i++)
但我看到很多专家都是这样开始的
(int i=0; i<10; ++i)
有什么真正的区别,还是一样?
当然,我知道前置增量和后置增量之间的区别。我的意思是在编写循环时应该使用哪一个?或视情况而定。
谢谢!
【问题讨论】:
我有一个关于编写循环的问题。我总是从
(int i=0; i<10; i++)
但我看到很多专家都是这样开始的
(int i=0; i<10; ++i)
有什么真正的区别,还是一样?
当然,我知道前置增量和后置增量之间的区别。我的意思是在编写循环时应该使用哪一个?或视情况而定。
谢谢!
【问题讨论】:
通常首选预增量,因为虽然它对原始类型没有影响,但对于迭代器来说可能更快,因为预增量不必返回其旧值的副本。
由于 preincrement 有时更快(使用非原始类型,如迭代器),因此即使在没有性能差异的情况下也可以进入一个好习惯,这就是许多人推荐它的原因。例如,这是C++ Coding Standards 中的第 28 项。
【讨论】:
两者没有区别。前增量和后增量是唯一的 区别。
i++ 和++i 的区别在于表达式的值。
i++ 的值是i 在增量之前的值。 ++i 的值是i 增加后的值。
但是在你的循环中它没有任何区别。
int i = 0;
00000088 xor edx,edx
0000008a mov dword ptr [ebp-40h],edx
i++;
0000008d inc dword ptr [ebp-40h]
++i;
00000090 inc dword ptr [ebp-40h]
如您所见,它对性能没有任何影响,但在某些情况下,您可能希望在序列点之后或之前增加一个数字。
在 C++ 中,++i 是左值,但 i++ 不是。
【讨论】:
前后递增的主要区别在于返回值。
后递增返回在变量增加之前已经存在的值,本质上是创建旧值的副本。预递增返回对新值的引用,从而避免创建临时变量。
一般来说,它没有什么区别,主要是个人喜好问题,但在某些内存不足的情况下,预增量选项可能更有用。我还读到后增量版本应该更慢(因为它会创建一个新的临时变量),但我还没有找到任何确凿的证据
【讨论】:
在 C++ 中存在差异。前缀运算符将返回对值的引用,而后缀运算符将返回一个副本,因此比前缀运算符慢。
【讨论】:
i 的类型是用户定义的且其operator++ 未内联时。