一篇文章彻底弄懂 i++和++i

本文详细探讨了Java编程中i++和++i的区别,不仅介绍它们的基础用法,还通过字节码文件解析了它们的运算原理。强调了在等号右边使用i++时,左边得到的值与运算前相同,而++i则是先运算再赋值。通过实例解析,帮助读者深入理解这两个操作符的差异。

一篇文章彻底弄懂 i++和++i

Java中i++和++i 想必大家都不陌生,但大多数同学对此可能都只是处于基础了解

    @Test
    public void calculate(){
        int i = 0;
        int m = i++;
        System.out.println(m);//输出0

        int a = 0;
        int b = ++a;
        System.out.println(b);//输出1
    }
}

绝大多数的同学对于二者的认知可能仅限于以上两个小计算

并且牢记住那个口诀,i++先赋值在运算 ++i 先运算在赋值

口诀固然无错,但是只有真正知晓背后的原理才能正确的使用

 @Test
//案例一
    public void cal(){

        int i = 1;
        i = i++;
        int j = i++;
        int k = i+ ++i * i++;
        System.out.println(i);
        System.out.println(j);
        System.out.println(k);
    }

假如碰到以上的案例,到底应该输出几?我想这时候单纯的背诵口诀已经很难解决后续的问题了,所以我们变从它的字节码文件来看待问题

i++:

0: iconst_0               // 生成整数0
         1: istore_1               // 将整数0赋值给1号存储单元(即变量i)
         2: iload_1                // 将1号存储单元的值加载到数据栈(此时 i=0,栈顶值为0)
         3: iinc          1, 1     // 1号存储单元的值+1(此时 i=1)
         6: istore_2               // 将数据栈顶的值(0)取出来赋值给2号存储单元(即变量m,此时i=1,m=0)
         7: return                 // 返回时:i=1,m=0

++i:

0: iconst_0                // 生成整数0
         1: istore_1                // 将整数0赋值给1号存储单元(即变量a)
         2: iinc          1, 1      // 1号存储单元的值+1(此时 a=1)
         5: iload_1                 // 将1号存储单元的值加载到数据栈(此时 a=1,栈顶值为1)
         6: istore_2                // 将数据栈顶的值(1)取出来赋值给2号存储单元(即变量j,此时a=1,b=1)
         7: return                  // 返回时:a=1,b=1

所以此时,我们再看一个案例,一步步的解析

int i = 0;
i = i++;
//大部分同学可能已经得出了正确答案,此时 i = 0;
/*
* 首先开辟空间i=0
* 将放到栈中
* 开始进行加法操作i=1
* 将数据栈中的值再次赋值给i 此时i = 0;
* */

所以案例一的答案已经呼之欲出了

		int i = 1;
        i = i++;//i=1
        int j = i++;//j=1 i = 2;
        int k = i+ ++i * i++;//k= 2+ 3*3 
//最后一步的i++在乘法运算时为3,但在运算结束后要进行赋值操作

总结:面对仍旧不理解的同学可以记住一点

​ i++在等号右边进行赋值操作时候,左边所得之数和i++未运算前一致

i++和++i的唯一区别即是i++为自加操作,自加操作不用在数据栈中进行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值