Java中i++、i–、++i、–i底层讲解 (减号加粗有点看不清,请谅解)

一、浅见理解:

1)i++i 后++ 就是先将 i 的值赋值给前面变量,i 自身再加1;

2)++ii 先++ 就是先将 i 自身先加1,再把运算结果赋值给前面变量,此时打印的 i 就是加1之后的结果

总结说明:①加号在后就先赋原来的值给前面变量(前面变量要是本身i的话,那么打印i的结果就是先赋值的结果);
②加号在前就先做加法,加之后的结果再赋值;

还没明白?看这
1)i++ 就是先把没有加之前 i 的值保存在一个容器里面,再去做加法自身加1,最后再去把保存在容器里的值赋给前面变量;
2)++i 就是先让 i 自身加1,再把加之后的 i 值保存在一个容器里,最后再去把保存在容器里的值赋给前面变量;
说明:其实就是后++就先把 i 值先保存起来;先++就先加1之后再保存,最后都是去容器里面取数赋给前面的变量;

测试(1):代码里有注释,读一读

public class Test1 {
  public static void main(String[] args) {
     int i = 10;
     int j = i++;//i是后++,先保存i(值为10)到容器,再自身加1,i值为11了,最后把容器里的值赋值给前面变量,所以打印前面变量j值为10
                 // 第一步 i 加1之后为11,只是保存到容器的值是10赋给了j.
     int k = ++i;//上一步计算之后i=11,这步是先++,先计算(i+1=12),再把加1后的i值保存到容器中,最后从容器取出数赋给k,所有k=12,
     i = --i;    //上一步计算之后i=12,先--之后得到(i-1=11),再把减1后的i值保存到容器中,最后从容器取出数赋给前面变量,所有打印的i=11
     System.out.println("j = " + j);
     System.out.println("k = " + k);
     System.out.println("i = " + i);
    }
}

打印结果:

j = 10
k = 12
i = 11

加大难度测试(2):

public class Test1 {
    public static void main(String[] args) {
        int i = 10;
        i = i++; // i = 10( 后++就先保存,再把容器里的值赋给前面变量,所以前面变量 i = 10了 )
        int k = i + --i * i++;//k = 10 + 9*9 = 91,i先是等于10;再先--之后i等于9;再后++,没有赋值,但是此时++了,就是变成了(i=10).
        System.out.println("i = " + i);
        System.out.println("k = " + k);
    }
}

打印结果:

i = 10
k = 91

二、底层分析:

1)上述过程用到了虚拟机栈,虚拟机栈中有栈帧,方法进栈就是一个栈帧,每个栈帧里面都有五个部分,其中有局部变量表和操作数栈,上述过程中的那个保存数的容器就是操作数栈,有的小伙伴可能还没有深入去了解过Java虚拟机(大名鼎鼎的JVM),这也没有关系的,这里我们先把自增和自减弄明白,之后再慢慢深入去了解底层的东西;简单理解为操作数栈是用来临时存放要计算的数的,最后的值是会加入到局部变量表中的;
2)定义一个int类型的 i = 10,当该变量所在方法(此时是main方法)就会进虚拟机栈创建栈帧,并加载到局部变量表中;
①假如执行 i++ : 就会先将 i 加入到操作数栈中临时存放,i 在局部变量表中自增加1,变成 i = 11,之后操作数栈中的数值(值为10)赋值给其他变量,也可以把值赋给 i 自身,所以其他变量的值就是操作数栈中的10;
②假如执行 ++i : 就会将 i 在局部变量表中自增加1,变成 i = 11,再将 i (i=11)加入到操作数栈中临时存放,之后将操作数栈中的数值赋值给其他变量,也可以把值赋给 i 自身,所以其他变量的值就是11了。

虚拟机栈简图:
在这里插入图片描述
无聊的题测一测:

public static void main(String[] args) {
        int i = 1;
        i = ++i;
        i = i--;
        int j = i * i++ + ++i + --i;
        System.out.println("i = " + i);
        System.out.println("j = " + j);
    }
}

执行结果过程:

public static void main(String[] args) {
        int i = 1;
     // 2     1
        i = ++i;
     // 2   
        i = i--;
     //         2   2       4     3     
        int j = i * i++ + ++i + --i;   // j = 2 * 2 + 4 + 3 = 11
        System.out.println("i = " + i);   // i = 3
        System.out.println("j = " + j);   // j = 11
    }      //你算对了没?
}

总之一句话:加号在前就先++,再赋值给变量;加号之后就直接赋值给变量即可,但别忘了,还是都得++的,只是赋值的顺序不一样而已。

主要是介绍++了,++会,–也不在话下了。觉得有用就点个赞 点个关注吧,哈哈哈//愉快

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐