evilgod528 2012-03-06 13: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 14: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条)

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境