# Java 自增自减复杂运算解题技巧
## 一、典型"变态"考题示例
```java
int i = 5;
int result = i++ + ++i * i-- - --i;
// 请问 result 等于多少?
```
看到这种 `i++++++*i-----` 的题不要慌!
---
## 二、核心解题原则
### 🎯 **优先级规则**
1. **括号 > 后缀 (++/--) > 前缀 (++/--) > 乘除 > 加减**
2. **从左到右依次计算**
3. **每个变量使用时,先判断它的当前值是多少**
---
## 三、解题步骤(万能方法)
### ✨ **逐步求值法**
**题目:**
```java
int i = 5;
int result = i++ + ++i * i-- - --i;
```
**第 1 步:标记每个运算符类型**
```
i++ + ++i * i-- - --i
后置 加 前置 乘 后置 减 前置
```
**第 2 步:从左到右逐步计算**
```
初始:i = 5
① i++ :后置自增
- 先取 i 的当前值 (5) 参与运算
- 然后 i 变成 6
- 此时表达式:5 + ++i * i-- - --i
② ++i :前置自增
- 先将 i 从 6 变成 7
- 再取新值 (7) 参与运算
- 此时表达式:5 + 7 * i-- - --i
③ i-- :后置自减
- 先取 i 的当前值 (7) 参与运算
- 然后 i 变成 6
- 此时表达式:5 + 7 * 7 - --i
④ --i :前置自减
- 先将 i 从 6 变成 5
- 再取新值 (5) 参与运算
- 此时表达式:5 + 7 * 7 - 5
```
**第 3 步:按数学运算法则计算**
```
result = 5 + 7 * 7 - 5
= 5 + 49 - 5
= 49
```
**最终答案:result = 49, i = 5**
---
## 四、更多例题演练
### 例题 1:基础版
```java
int i = 3;
int a = i++ + ++i;
// 答案:a = 8, i = 5
// 解析:
// ① i++ → 取 3,i 变 4
// ② ++i → i 变 5,取 5
// ③ 3 + 5 = 8
```
### 例题 2:乘法版
```java
int i = 2;
int b = ++i * i++ * ++i;
// 答案:b = 60, i = 5
// 解析:
// ① ++i → i 变 3,取 3
// ② i++ → 取 3,i 变 4
// ③ ++i → i 变 5,取 5
// ④ 3 * 3 * 5 = 45
```
### 例题 3:混合版
```java
int i = 4;
int c = i-- - --i + ++i;
// 答案:c = 4, i = 4
// 解析:
// ① i-- → 取 4,i 变 3
// ② --i → i 变 2,取 2
// ③ ++i → i 变 3,取 3
// ④ 4 - 2 + 3 = 5
```
---
## 五、实用技巧总结
### ✅ **做题三步法**
1. **标序号**:从左到右给每个运算符标号
2. **跟踪 i**:记录每次运算后 i 的变化
3. **代数值**:把确定的值代入表达式计算
### ⚠️ **避坑指南**
1. **不要跳步**:必须一步一步来,每步只处理一个运算符
2. **盯紧 i**:随时记录 i 的当前值
3. **区分前后**:
- 前缀(++i/--i):先改值,再使用
- 后缀(i++/i--):先使用,再改值
### 🎓 **面试加分项**
如果面试官问你这种题,可以这样回答:
> "这类题目主要考察对自增自减运算符优先级和结合性的理解。我的解题方法是:
> 1. 明确每个运算符是前缀还是后缀
> 2. 从左到右依次求值,记录变量变化
> 3. 最后按数学运算法则计算
>
> 不过在实际开发中,我们会避免写这种难以维护的代码,通常会拆分成多行清晰的语句。"
---
## 六、实际开发建议
⚠️ **重要提醒**:
这种复杂表达式**只适合考试**,实际工作中**千万不要这样写**!
**错误示范(不要学):**
```java
int result = i++ + ++i * i--; // 让人头大
```
**正确写法:**
```java
// 第一步
int temp1 = i;
i++;
// 第二步
i++;
int temp2 = i;
// 第三步
int temp3 = i;
i--;
// 计算结果
int result = temp1 + temp2 * temp3;
```
---
## 七、快速记忆口诀
```
前缀先加后用值,后缀先用后加值
从左到右慢慢算,每一步都记清楚
括号乘除优先级,最后再来做加减
实际开发别这样,代码清晰最重要
```
---
## 八、实战练习
试试这道题(答案在最下方):
```java
int i = 6;
int result = ++i + i++ * 2 - --i;
```
.
.
.
.
.
**答案:**
```
解析:
① ++i → i 变 7,取 7
② i++ → 取 7,i 变 8
③ --i → i 变 7,取 7
④ 表达式:7 + 7 * 2 - 7 = 7 + 14 - 7 = 14
最终:result = 14, i = 7
```
---
**总结**:这种题就是纸老虎,按照步骤一步步来,你一定能做对!加油!💪