预增量 ++i 递增 i 的值并计算为新的递增值。
int i = 3;
int preIncrementResult = ++i;
Assert( preIncrementResult == 4 );
Assert( i == 4 );
后递增 i++ 递增 i 的值并计算为原始未递增的值。
int i = 3;
int postIncrementResult = i++;
Assert( postIncrementtResult == 3 );
Assert( i == 4 );
在 C++ 中,预增量通常是首选,您可以使用其中任何一个。
这是因为如果您使用后增量,它可能要求编译器必须生成创建额外临时变量的代码。这是因为要递增的变量的先前值和新值都需要保存在某个地方,因为它们可能在正在评估的表达式的其他地方需要。
因此,至少在 C++ 中,可能存在指导您选择使用哪一个的性能差异。
这主要是当被递增的变量是一个用户定义的类型并且覆盖了 ++ 运算符时才会出现问题。对于原始类型(int 等),没有性能差异。但是,值得坚持使用前增量运算符作为指导,除非后增量运算符绝对是必需的。
还有一些讨论here。
在 C++ 中,如果您使用的是 STL,那么您可能会使用带有迭代器的 for 循环。这些主要具有覆盖的 ++ 运算符,因此坚持预增量是一个好主意。编译器一直在变得更聪明,并且较新的编译器可能能够执行优化,这意味着没有性能差异 - 特别是如果正在递增的类型是在头文件中内联定义的(因为 STL 实现通常是这样),以便编译器可以看到如何该方法被实施,然后可以知道哪些优化可以安全地执行。即便如此,可能仍然值得坚持预增量,因为循环会执行很多次,这意味着小的性能损失很快就会被放大。
在其他语言(例如 C#)中,++ 运算符不能重载,因此没有性能差异。在循环中用于推进循环变量,前后自增运算符是等价的。
更正:允许在 C# 中重载 ++。不过,与 C++ 相比,在 C# 中,您似乎不能独立地重载 pre 和 post 版本。因此,我假设如果在 C# 中调用 ++ 的结果没有分配给变量或用作复杂表达式的一部分,那么编译器会将 ++ 的前后版本缩减为执行等效的代码。