int a=0;a=a++;

生成的字节码是:

0 iconst_0 —–0压入栈顶

1 istore_1 [a] —–栈顶值(0)存入局部变量1(a)

2 iload_1 [a] —–变量1的值压入栈顶(值为0)(a++效果)

3 iinc 1 1 [a] —–变量1自加(a++操作,自加后变量1的值为1)

6 istore_1 [a] —–将栈顶值(0)存入变量1(=操作)

a的值依次变化为:0->1->0

运算符的优先级中++和–仅次于(),而a++正常的逻辑是++在下一行才会生效,但这里使用的是同一个变量,所以这里是先把右边运算的结果(也就是a的原始值0)压入栈,然后再去计算a++,由于=的优先级是最低的,所以最后再将运算过的值赋值给左边的a

int a=0;a=++a;

生成的字节码是:

0 iconst_0 —–0压入栈顶

1 istore_1 [a] —–栈顶值(0)存入局部变量1(a)

2 iinc 1 1 [a] —–变量1自加(++a操作,自加后变量1的值为1)

5 iload_1 [a] —–变量1的值压入栈顶(值为1)(++a效果)

6 istore_1 [a] —–将栈顶值(1)存入变量1(=操作)

a的值依次变化为:0->1->1

int a=0;a=(a++)+(++a);

0 iconst_0 —–0压入栈顶

1 istore_1 [a] —–栈顶值(0)存入局部变量1(a)

2 iload_1 [a] —–变量1的值压入栈顶(值为0)(a++效果)

3 iinc 1 1 [a] —–变量1自加(a++操作,自加后变量1的值为1)

6 iinc 1 1 [a] —–变量1自加(++a操作,自加后变量1的值为2)

9 iload_1 [a] —–变量1的值压入栈顶(值为2)(++a效果)

10 iadd —–栈顶两值(0,2)相加(结果为2),并存入栈顶

11 istore_1 [a]—–将栈顶值(2)存入变量1(=操作)

a的值依次变化为:0->1->2->2

这里是先计算括号里边的值,左边的括号是先存a的值,然后压入栈用来计算之后的a++(由于有++才有了这一步),这时候左边的括号内容进行运算,然后a自加;右边括号先进行a自加然后进行运算,这时候右边括号的值为2,然后赋值给a

总结:应该是++的优先级最高,所以a++是会先取a的值,然后a进行自加,然后使用取出的值进行运算,最后在进行=的赋值操作,所以是因为=的优先级最低,所以=的赋值覆盖了a自加的值.

但在实际编码的过程中还是尽量不要用不好理解的代码.