evilgod528 2012-03-06 05:14
浏览 197
已采纳

关于自增的困惑,求详解



class Test{
    public static void main(String[] args){
        int a = 10; 
        for(int i=0;i<10;i++){
            a=a++;
        }
        System.out.println(a);
    }
}

 上面输出的结果还是10,求具体代码实现原因。

  • 写回答

6条回答 默认 最新

  • 仲涵 2012-03-07 06:16
    关注

    这个问题只凭想象很难理解,看看字节码怎么执行就能明白了,通过javap命令得到字节码如下:
    public static void main(java.lang.String[]);
    Code:
    0: bipush 10 //将10推到栈顶
    2: istore_1 //将栈顶int型数值存入第二个本地变量

    3: iconst_0 //将int型0推送至栈顶
    4: istore_2 //将栈顶int型数值存入第三个本地变量
    5: goto 16 //跳转
    8: iload_1 //将第二个int型本地变量推送至栈顶

    9: iinc 1, 1 //将指定int型变量增加指定值(i++, i--, i+=2)

    12: istore_1 //将栈顶int型数值存入第二个本地变量

    13: iinc 2, 1 //将指定int型变量增加指定值(i++, i--, i+=2)
    16: iload_2 //将第三个int型本地变量推送至栈顶

    17: bipush 10 //将10推到栈顶
    19: if_icmplt 8 //比较栈顶两int型数值大小,当结果小于0时跳转

    22: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
    25: iload_1
    26: invokevirtual #22; //Method java/io/PrintStream.println:(I)V
    29: return

    上面我已经添加注释了,其中“a=a++;”这句对应的字节码为:
    8: iload_1 //将第二个int型本地变量(a=10)推送至栈顶 ,此时栈顶值为10
    9: iinc 1, 1 //将指定int型变量增加指定值(此时a=11),但此时栈顶值不 变,还是10

    12: istore_1 //将栈顶int型数值(10)存入第二个本地变量(a=10)

    最终a获取栈顶值10

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部