i++和++i 的区别深度剖析

引言

这两天忙得要命,天天擦屁股,没有时间来写博客。这篇博客酝酿了三四天了,今天刚好抽出一点时间来写(晚上学校缴费平台系统还要上线,扎心啊)。
前两天在**“java小葵花妈妈课堂**”中,曹贱贱提了一个很基本很基本的灵魂一问,让我们仿佛置身于2016年刚出来找工作的时候。当年只知道两者好像有区别,但是找工作的时候不会在意这些细节,因为没有做过项目,也意识不到这个问题的重要性,现在刚好跟大家一起学习下。
问题是这样的,问i++ 和++i的区别? 废话不多说,我们来通过例子分析下。

代码分析

  public static void test1(){
        int i=0;
        i = (i++);
        System.out.println("i的值是:"+i);
        int j=0;
        j = ++j;
        System.out.println("j的值是:"+j);
    }

运行结果

i的值是:0
j的值是:1

纳尼??? 特么是不是很惊讶?这种细节你关心过没?反正我是有点预料之外的。
那么我们来分析下,到底怎么回事。
首先确认两点:
不管是对象还是常量还是方法,都是通过指向他的引用使用它的值。
不管是i++还是++i,他们和运算符优先级没有关系。

那么我们来分析i++:

  • 在i指向的引用中,直接将常量i加1,引用是没有改变的;

我们再来分析 i=i++:

  • 这个方法首先把i的引用指向了i;
  • 在从堆中开辟一块内存,用来存储i+1的值;
  • 此时i依然指向之前的值。

总结:单独使用i++;i的值会改变,但是当通过引用使用此常量的时候,会指向以前的旧值。

我们再来分析++i:

  • 首先开辟一块内存,将常量i+1保存,引用是没有改变的;

那么i=++i呢?

  • 首先开辟一块内存,将常量i+1保存;
  • 然后将新值的引用指向i;
    总结:单独使用++i;i的值会改变,当通过引用使用此常量的时候,会指向新值。

再列举几个经典的小李子:

  • 例子1:
 public static void test2(){
        int i=0;
        i++;
        System.out.println("i的值是:"+i++);
        System.out.println("i的值是:"+i);
    }

运行结果:

i的值是:1
i的值是:2

解读:

    public static void test2(){
        int i=0;
        i++;//
        System.out.println("i的值是:"+i++);//此时输出的是i的引用,即旧值,但是实际上,内存中已经发生了常量的改变
        System.out.println("i的值是:"+i);//此时i+1的引用已经重新指向了i
    }
  • 例子2
 public static void test3(){
        int i = 0;
        i = i++ + ++i;
        System.out.println("i的值是:"+i);
    }

运行结果:

i的值是:2

总结

(1)单独使用i++;i的值会改变,但是当通过引用使用此常量的时候,会指向以前的旧值。
(2)单独使用++i;i的值会改变,当通过引用使用此常量的时候,会指向新值。

大家如果有什么疑问或者其他好玩的小程序欢迎给我留言!!!


作者:select you from me
来源:CSDN
转载请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值