为什么 ++i 通常比 i++ 更好?
介绍
如果你之前写过 for 循环,那么你一定使用过 i++
来增加你的循环变量。
然而,你是否考虑过为什么要选择这种做法呢?
我们在执行完 i++
后,i
的值会比它先前大 1,这是我们想要的结果。与此同时还有很多方法可以做到,比如:++i
甚至 i = i + 1
。
接下来,我会对比介绍两种实现变量加 1 的方法:++i
和 i++
,并解释为什么大多数情况下 ++i
可能好于 i++
。
后递增(i++)
i++
方法(或者叫后递增)是最常见的使用方式。
在伪代码中,后递增操作符对变量 i
的操作大致如下:
1 | int j = i; |
由于后递增需要返回 i
的原值而不是返回 i + 1
后的增量值,所以需要将 i
的旧值进行存储。
这意味着 i++
需要额外的内存来存储这个值,但这是不必要的。因为在大多数情况下,我们并不会使用 i
的旧值,而是直接将其丢弃。
前递增(++i)
++i
方法(或者叫前递增)比较少见,通常是使用 C
和 C++
的老程序员在用。
在伪代码中,前递增操作符对变量 i
的操作大致如下:
1 | i = i + 1; |
需要注意的是,在前递增中,我们不必保存 i
的旧值,我们只需简单的对它加 1 并返回。这与 for
循环中的经典用例更加匹配:正如上文所说,我们很少需要 i
的旧值。
说明
看过后递增和前递增之间的区别后,你可能会想到:由于 i
的旧值在后递增中未被使用,因此在编译阶段,编译器将会优化掉这一行,使两个操作符等价。
对于基本类型来说(如整形)确实如此。
但是对于复杂类型,例如(在 C++
中)用户自定义类型或带有 +
操作重载的迭代器,编译器就无法对此进行优化了。
所以如果说在你用不到所要递增变量旧值的情况下,使用前递增运算符要好过(或等价于)后递增。