美文网首页
Java i++ 和 ++i原理

Java i++ 和 ++i原理

作者: 半罐子晃 | 来源:发表于2021-07-07 20:39 被阅读0次

    i++ 和 ++i原理

    i++ 即后加加,原理是:先自增,然后返回自增之前的值
    ++i 即前加加,原理是:先自增,然后返回自增之后的值
    重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增。
    对于++i 就不说了,大多数人都懂,而对于 i++ 的原理,我用代码模拟其原理,如下:

    int temp = i;
    i = i + 1;
    return temp; 
    

    这3句代码就是上面所说的那样:i++是先自增,然后才返回自增之前的值。
    i++字节码分析

    有很多的人写的文章上都是说i++是先返回i的值,然后再自增,这是错误,是先自增,然后再返回自增之前的值,你可能会问,这有区别吗?答案:有的。只要这个没理解对,则你在计算i++的相关问题时就有可能算错。

    有的人可能又会问了,我凭什么相信你,你有什么证据证明i++是先自增,然后再返回自增之前的值吗?我还真去找过证据,我们把class的字节码搞出来,分析一下就知道了,证明如下:

    public class Test {
        void fun() {
            int i = 0;
            i = i++;
        }
    }
    

    如上,我们写了一个超级简单的Test类。在cmd中输入这个命令(javap -c Test.class)以查看其生成的字节码,截图如下:



    我们关注fun()方法这一段就可以了,如下:


    这就是fun()函数对应的字节码了,我们一行一行的来分析,首先我们要说两个概念,一个是变量,一个是操作栈,fun()方法中有两个变量,哎,不是只有一个变量i吗?怎么会有两个?要了解这个你需要去学习字节码的相关知识,这里我们不深究,我画图如下:


    如上图,变量有两个,在位置0的变量是什么我们不要管,系统自动分配的,你要知道的是位置1的变量其实就是我们定义的变量i就行了,接下来,我们来一行行分析fun()方法对应的字节码:
    “ iconst_0 ” i代表int类型,const代表常量,0就代表整数0,整句话的意思就是把int类型的常量0放入操作栈的栈顶中,图解如下:



    “ istore_1 ” i代表int类型,store代表存储,1代表位置为1的变量,整句话的意思就是把操作栈中栈顶的值拿走,保存到位置为1的变量上,图解如下:


    “ iload_1 ” i代表int类型,load代表加载变量的值,1代表位置为1的变量,整句话的意思就是把位置为1的变量的值加载到操作栈的栈顶中,图解如下:


    “ iinc 1, 1 ” i代表int类型,inc(increment)代表增加,这里还有两个1,前面的1代表对位置为1的变量,第2个1代表增加1,因为有i += 3这种自增操作,这种情况的话第2个数字会是3,即自增3(iinc 1, 3)。“iinc 1, 1” 整句话的意思就是把位置为1的变量的值增加1,图解如下:


    注:自增操作不会改变操作栈中的值,所以变量i的值自增后变成了1,而操作栈中的值还是0。

    “ istore_1 ” i代表int类型,store代表存储,1代表位置1的变量,整句话的意思就是:把栈顶中的值拿走,保存到位置为1的变量中,图解如下:


    所以,这几行字节码合起来看,i++不就是先自增,然后才返回自增之前的值嘛!!所以大家千万别搞错顺序了。 用代码理解的话,就相当于下面的代码:

    int temp = i;
    i = i + 1;
    return temp;  
    

    最后再把++i的字节码图也贴一下,大家可以根据我上面讲解的知识分析一下,就会知道++i和i++的区别了:

    void fun() {
        int i = 0;
        i = ++i;
    }
    

    ++i字节码图


    原文链接:https://blog.csdn.net/android_cai_niao/article/details/106027313

    相关文章

      网友评论

          本文标题:Java i++ 和 ++i原理

          本文链接:https://www.haomeiwen.com/subject/cdsaultx.html