Java:int a=0;a=a++;问:a=?

2017-04-01  本文已影响0人  zoder

感兴趣的小伙伴可以去测试一下。

答案: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

上一篇下一篇

猜你喜欢

热点阅读