++i先递增后返回引用,可作左值;i++先返回副本再递增,为右值。内置类型性能相近,类类型中++i更高效,推荐循环使用++i,需用原值时才用i++。

i++ 和 ++i 在C++中都用于将变量 i 的值加1,但它们在使用时机和返回值上有本质区别。理解这一点对编写高效、正确的代码非常重要。
1. 基本行为区别
前缀递增(++i):先将变量的值加1,然后返回递增后的值。 后缀递增(i++):先返回变量的原始值,然后再将变量的值加1。举例说明:
int i = 5;
int a = ++i; // i 先变为6,a 得到6
int b = i++; // b 得到6,然后 i 变为7
执行后:a = 6, b = 6, i = 7。
2. 返回值类型不同
在底层实现上,这两种操作符的返回值类型不同:
立即学习“C++免费学习笔记(深入)”;
- ++i 返回的是变量本身的引用(int&),可以继续参与左值操作。
- i++ 返回的是递增前的值的副本(int),是一个右值,不能被赋值。
示例:
int i = 5;
(++i) = 10; // 合法,++i 返回 i 的引用
(i++) = 10; // 错误!i++ 返回临时值,不能赋值
3. 性能差异(尤其在类类型中)
对于内置类型(如 int),编译器通常会优化掉后缀递增的临时副本,因此性能差异几乎可以忽略。
但对于用户自定义类型(如迭代器、大对象),情况不同:
- ++i:只需构造一个递增后的对象并返回引用,效率高。
- i++:需要先保存原值作为返回值,再递增,多一次拷贝构造,开销更大。
比如在遍历容器时,推荐使用前缀形式:
for (auto it = vec.begin(); it != vec.end(); ++it) { ... } // 推荐
4. 使用场景建议
根据用途选择合适的递增方式:
- 如果只需要递增变量本身,不关心旧值,用 ++i。更高效,是良好习惯。
- 如果需要在表达式中使用递增前的值,才使用 i++。
常见正确使用 i++ 的例子:
arr[i++] = value; // 先用当前 i 赋值,再递增
而单纯循环中:
while (i
基本上就这些。简单说:++i 更快更直接,i++ 多用于需要原值的场合。养成优先使用 ++i 的习惯,尤其在C++中处理对象时尤为重要。











