美文网首页
Java:int a=0;a=a++;问:a=?

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

作者: zoder | 来源:发表于2017-04-01 11:22 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Java:int a=0;a=a++;问:a=?

          本文链接:https://www.haomeiwen.com/subject/zmkiottx.html