i++与++i的区别
在C++中, i++ (后自增)和 ++i (前自增)都用于将变量值加1,但核心区别在于操作顺序和返回值,具体如下:
1. 操作顺序不同
- ++i (前自增):先将变量值加1,再使用新值。
cpp
int i = 5;
int j = ++i; // i先变为6,再将6赋给j → i=6,j=6
- i++ (后自增):先使用变量的原始值,再将值加1。
cpp
int i = 5;
int j = i++; // 先将5赋给j,i再变为6 → i=6,j=5
2. 返回值类型
- ++i :返回变量本身的引用(左值),可继续赋值。
cpp
int i = 5;
(++i) = 10; // 合法,i先加1变为6,再被赋值为10 → i=10
- i++ :返回临时值(右值),不能继续赋值。
cpp
int i = 5;
(i++) = 10; // 编译错误,i++返回的是临时值(5),无法赋值
3. 效率差异(针对自定义类型)
- 对基本类型(int、float等),两者效率几乎无差别(编译器会优化)。
- 对自定义类对象, ++i 更高效:
- ++i 直接修改对象并返回引用,无临时对象生成。
- i++ 需创建临时对象保存原始值,再修改对象,开销更大。
4. 常见使用场景
- ++i :常用于需要立即使用新值的场景(如循环计数器)。
cpp
for (int i = 0; i < 10; ++i) { // 推荐用前自增,效率略高
cout << i << endl;
}
- i++ :当需要先使用原始值,再自增时(如表达式中间步骤)。
cpp
int a = 3, b;
b = a++ + 5; // b = 3+5=8,a变为4
总结
- 前自增 ++i :先自增,再取值 → 返回引用 → 效率更高(类对象场景)。
- 后自增 i++ :先取值,再自增 → 返回临时值 → 适用于需要原始值的场景。
使用时需注意顺序对逻辑的影响,避免因混淆导致bug。