j++与++j的区别

j++和++j的结果都是+1,但是在指令级的操作模式完全不一样

以下代码输出结果为:0

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

javap -c  类.class会生成以下指令集信息   

 0: iconst_0          //将int型(0)推送至栈顶       

 1: istore_1           //将栈顶int型数值存入下标为1的本地变量

 2: iconst_0          //将int型(0)推送至栈顶

 3: istore_2          //将栈顶int型数值存入下标为2的本地变量

 4: goto          15   //跳转到15行

 7: iload_1           //将下标为1的int型本地变量推送至栈顶

 8: iinc          1, 1    //将下标为1的int型变量增加指定值  (i++, i--, i+=2) 

11: istore_1         //将栈顶int型数值存入下标为1的本地变量

12: iinc          2, 1   //将下标为2的int型变量加1

15: iload_2          //将下标为2的int型本地变量推送至栈顶

16: bipush        100   //将单字节的常量值(-128~127)推送至栈顶

18: if_icmplt     7       //比较栈顶两int型数值大小,当结果小于0时跳转到第【7】行

21: getstatic     #16     // Field java/lang/System.out:Ljava/io/PrintStream;      //获取指定类的静态域,并将其值压入栈顶 

24: iload_1       //将第二个int型本地变量推送至栈顶-------------

25: invokevirtual #22                 // Method java/io/PrintStream.println:(I)V  //调用实例方法

28: return       

重点指令集解析:

iload_1:  j在变量表里面的下标为1,将j的值推到操作数栈中j=0;

iinc :这个操作是在本地变量表里面将j+1;此时j=1;并未改变操作数栈里面j的值

istore_1;     j=j++ ; 将操作数栈里面j的值赋给局部变量表里面的j,此时j=0;

 

 

将j=j++,改为j=++j;

 

 7: iinc          1, 1   //将下标为1的局部变量(j)加1,此时j=1;
10: iload_1           //将下标为1的局部变量(j)推到操作数栈,此时操作数栈里面,j=1;
11: istore_1        //将操作数栈栈顶的值赋给局部变量表中下标为1的局部变量(j)此时j=1;

最后输入的结果为:10

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值