自增(++)和自减(--)的关键在于前缀与后缀的执行顺序:前缀(++i)先变后用,后缀(i++)先用后变;参与赋值时行为不同,如i = i++值不变,而i = ++i值加1。

Java里的自增(++)和自减(--)不是简单的“加1”或“减1”,关键要看它出现在变量的**前面还是后面**,以及是否参与了**赋值或表达式计算**。真正容易出错的地方,恰恰就藏在“先用再变”和“先变再用”的顺序差异里。
前缀与后缀的核心区别
前缀形式(++i、--i):变量先完成+1或-1,再把新值用于后续操作。
后缀形式(i++、i--):变量先把当前值拿出来用,用完之后再+1或-1。
- int i = 5; int a = ++i; → i 先变成6,a 得到6
- int i = 5; int b = i++; → i 先被取值为5给b,然后i才变成6;所以b=5,i=6
单独使用时其实没区别
如果只是写 i++ 或 ++i 单独成句(没有赋值、没参与运算),那它们效果完全一样:变量都加1,且不产生中间值。
- i++; 和 ++i; 在 for 循环头里(如 for (int i=0; i)可以互换,行为一致
- 此时 JVM 直接在本地变量表中修改值,不压栈、不备份,效率相同
参与赋值时最容易踩坑
最经典的陷阱是:i = i++; —— 这行代码执行完,i 的值**不变**。
立即学习“Java免费学习笔记(深入)”;
- 原因:i++ 先返回旧值(比如1),再让i自增为2;但紧接着这个旧值(1)又被赋回给i,覆盖了刚变的2
- 等价于:temp = i; i = i + 1; i = temp;
- 类似地,i = ++i; 是安全的,它先自增再赋值,结果是预期的+1
底层行为简明说明
JVM 对单纯自增/自减做了优化:不走操作数栈,直接在局部变量表中修改值。但一旦涉及表达式(比如 k = i++ + ++j * i),就会按规则分步处理——先取值、再计算、最后更新变量。
- 后缀操作(i++)会临时保存原始值,供当前表达式使用
- 所有自增/自减操作都作用于变量本身,不能用于字面量或表达式,如 5++ 或 (a+b)++ 是编译错误
- 操作符只能用于变量,本质是 i = i + 1 的语法糖,但语义更严格
基本上就这些。理解清楚“谁先谁后”和“值从哪来”,就能避开90%的自增自减误区。










