i++先取旧值再自增并赋旧值,++i先自增再赋新值;i=i++结果不变,因赋回的是旧值;++i更高效,避免临时副本。

赋值过程中,i++ 和 ++i 的底层行为完全不同——关键不在“加多少”,而在“什么时候把哪个值交给左边的变量”。
i++:先取旧值,再自增,最后用旧值赋值
执行 a = i++ 时,底层实际走三步:
- 把
i当前值(比如 5)拷贝进一个临时位置(临时变量或操作数栈) - 让
i自身加 1(变成 6) - 把刚才拷贝的旧值(5)赋给
a
所以结果是:a = 5,i = 6。注意:赋给 a 的不是自增后的值,而是快照式的原值。
++i:先自增,再用新值赋值
执行 a = ++i 时,底层只做两步:
- 直接让
i加 1(从 5 变成 6) - 把此刻
i的新值(6)赋给a
没有临时拷贝,不保留旧值。结果是:a = 6,i = 6。
最易踩坑的场景:i = i++
这句看似“只是自增”,实则暴露底层逻辑差异:
- 先记下
i的旧值(如 5)→ 存临时位置 -
i自增为 6 - 把临时位置的旧值(5)赋回
i
最终 i 还是 5。这不是 bug,而是严格按 i++ 的语义执行的结果。
为什么++i在某些情况下更“干净”?
它省去了临时存储步骤,在涉及对象、迭代器或重载运算符的场景中,避免了不必要的副本构造。对基本类型,编译器常会优化掉这个差异;但语义清晰性始终是 ++i 的优势。










