int n = 10;
n+=(n++)+(++n);
// // 按照基本语法推测
// // 第一步:取n的值,用来做加法 [10 + ?]
// // 第二步:++n先加再取值,n变成了11 [10 + 11]
// // 第三步:执行加法,得到21
// // 第四步:计算+=操作 n = n + 21 [11 + 21]
// // 第五步:计算n++里面的自增1,n从32变成33
// n += (n++) +(++n);
// // 根据前面推理的结果这里应该是33
为什么是32???
D:\record-video-original\day03\code>javap -c Demo07GiveOperatorExercise.class
Compiled from "Demo07GiveOperatorExercise.java"
public class Demo07GiveOperatorExercise {
public Demo07GiveOperatorExercise();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: istore_1
3: iload_1
4: iload_1
5: iinc 1, 1
8: iinc 1, 1
11: iload_1
12: iadd
13: iadd
14: istore_1
15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_1
19: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
22: return
}
// 根据反编译字节码文件,看到实际执行过程后,每一步推理如下:
// 0: bipush 10 准备常量10
// 2: istore_1 将10赋值给n
int n = 10;
// 3: iload_1 读取变量n的值 [10 + ?]
// 4: iload_1 读取变量n的值 [10 + 10]
// 5: iinc 1, 1 执行自增1 n从10变成11
// 8: iinc 1, 1 执行自增1 n从11变成12
// 11: iload_1 读取变量n的值,现在是12
// 12: iadd 执行加法10 + 10等于20
// 13: iadd 执行加法12 + 20等于32
// 14: istore_1 把最后一个加法的结果32赋值给n
n += (n++) + (++n);
// 最后n是32
真不理解,只能说重要的是不要写类似这样有歧义的代码。