把你贴的代码,编译成jvm 字节码后是这样的:
0 iconst_2
1 istore_1
2 iload_1
3 iload_1
4 iinc 1 by 1
7 iload_1
8 iload_1
9 iinc 1 by 1
12 imul
13 isub
14 dup
15 istore_1
16 iadd
17 istore_1
18 getstatic #16
21 iload_1
22 invokevirtual #22
25 return
我大概给你解释下这里面的运行轨迹,首先第一步把常量2压入栈中,然后给a赋值a=2,然后把a的变量压入栈中,执行两次,然后变量a自增,此时a=3,然后把变量a压入栈中,执行两次,这个时候栈中的结构如下:
然后变量a自增,a=4,然后栈顶元素执行相乘操作,这个时候栈内结构如下:
然后栈顶元素执行相减操作,结果如下:
最后执行相加操作,再赋值给变量a,此时变量a=-5,就是你打印的结果。
至于你问的这个a的问题,根据这个代码可以看的很明白,你a++和++a之后的a还是2,是因为 a这个变量在你执行++操作之前就已经压入栈中了,所以还是2。