停止在你的循环中使用 i++

为什么 ++i 通常比 i++ 更好?

介绍

如果你之前写过 for 循环,那么你一定使用过 i++ 来增加你的循环变量。

然而,你是否考虑过为什么要选择这种做法呢?

我们在执行完 i++ 后,i 的值会比它先前大 1,这是我们想要的结果。与此同时还有很多方法可以做到,比如:++i 甚至 i = i + 1

接下来,我会对比介绍两种实现变量加 1 的方法:++ii++,并解释为什么大多数情况下 ++i 可能好于 i++

后递增(i++)

i++ 方法(或者叫后递增)是最常见的使用方式。

在伪代码中,后递增操作符对变量 i 的操作大致如下:

1
2
3
int j = i;
i = i + 1;
return j;

由于后递增需要返回 i 的原值而不是返回 i + 1 后的增量值,所以需要将 i 的旧值进行存储。

这意味着 i++ 需要额外的内存来存储这个值,但这是不必要的。因为在大多数情况下,我们并不会使用 i 的旧值,而是直接将其丢弃。

前递增(++i)

++i 方法(或者叫前递增)比较少见,通常是使用 CC++ 的老程序员在用。

在伪代码中,前递增操作符对变量 i 的操作大致如下:

1
2
i = i + 1;
return i;

需要注意的是,在前递增中,我们不必保存 i 的旧值,我们只需简单的对它加 1 并返回。这与 for 循环中的经典用例更加匹配:正如上文所说,我们很少需要 i 的旧值。

说明

看过后递增和前递增之间的区别后,你可能会想到:由于 i 的旧值在后递增中未被使用,因此在编译阶段,编译器将会优化掉这一行,使两个操作符等价。

对于基本类型来说(如整形)确实如此。

但是对于复杂类型,例如(在 C++ 中)用户自定义类型或带有 + 操作重载的迭代器,编译器就无法对此进行优化了。

所以如果说在你用不到所要递增变量旧值的情况下,使用前递增运算符要好过(或等价于)后递增。