感兴趣的小伙伴可以去测试一下。
答案:a=0
我当时也是有点疑惑的:虽然是先执行计算然后再执行自加操作,但是a还是自加了啊!
代码测试的结果就是a=0
我就在思考a=a++这句代码,是将右边表达式的值赋值给左边的变量。那么a++表达式的值其实是0,
然后赋值给了a,所以a=0。
我这么想好像还解释的通哈。
直到我看到了有大神通过Java字节码来分析其中的原由的时候,我才恍然大悟。
下面给出类似问题的字节码分析过程:
使用 javap -v Test >> test.txt 将Test类的字节码信息输出到text.txt
1、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
2、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
3、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
网友评论