美文网首页
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原理

    i++ 和 ++i原理 i++ 即后加加,原理是:先自增,然后返回自增之前的值++i 即前加加,原理是:先自增,然...

  • Java中的i++ 和 ++i 在for循环使用

    Java的i++ 和++i 的区别i++:先赋值,后计算;++i;先计算,后赋值。 for循环中的i++和++i...

  • JavaScript没有块级作用域

    如下代码: for (var i=0;i<3;i++) { } alert(i); 结果:弹框弹出3; 和java...

  • JAVA i = i++;

    int i = 0;i = i++;System.out.println(i); // ? 最终结果是什么? JA...

  • Java 多线程——线程安全、线程池

    线程不安全的表现 操作共享数据,导致数据错误(非原子操作) i++ (Java 多线程原理[https://www...

  • java知识集合

    i=0;i= i++ ;结果i=0 因为先引用,后计算java使用中间变量缓存机制i=i++可以分为几步:1. t...

  • kotlin for 循环

    kotlin 与java 的for循环是有区别的 java: for(int i=0;i<9;i++){ } ko...

  • Java 自增运算 i++ 和 ++i 的深入理解

    简单理解: i++ 是先运算后自增 ++i 是先自增后运算 虚拟机执行原理 java代码 编译后代码 jvm指令代...

  • Java i++ 与 ++i

    i++ 是后加运算符,即先赋值,然后自增长1。 ++i 是前加运算符,先自增长1,然后再赋值。 所以,下面的代码:

  • i++和++i

    i++ 先赋值后相加 //结果65 ++i 先自加后赋值 //结果66

网友评论

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

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