java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > i++与++i的实现原理

Java中的递增i++与++i的实现原理详解

作者:ゞ浪人与酒丶0

这篇文章主要介绍了Java中的i++与++i的实现原理详解,在Java中,i++是一种常见的递增操作符,用于将变量i的值增加1,它是一种简洁且方便的方式来实现循环和计数功能,i++可以用于各种情况,本文来看一下其实现原理,需要的朋友可以参考下

前言

在Java中,i++是一种常见的递增操作符,用于将变量i的值增加1。

它是一种简洁且方便的方式来实现循环和计数功能。i++可以用于各种情况,例如在for循环中迭代数组或列表的元素,或者在计数器中跟踪某个事件的发生次数。

通过使用i++,我们可以轻松地实现自增操作,而无需手动编写i = i + 1的代码。

i++

首先先看一段代码

public class Test {
    public static void main(String[] args) {
        foo();
    }
    public static void foo() {
       int i = 0;
        for (int j = 0; j < 50; j++) {
            i = i++;
        }
        System.out.println(i);
    }
}

执行上述代码输出结果是0,而不是50

0

对应字节码

public class com.yxzapp.Test {
  public com.yxzapp.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method foo:()V
       3: return
  public static void foo();
    Code:
       0: iconst_0
       1: istore_0
       2: iconst_0
       3: istore_1
       4: iload_1
       5: bipush        50
       7: if_icmpge     21
      10: iload_0                           // 把局部变量下标0的变量加载到操作数栈上
      11: iinc          0, 1                // 对局部变量表表为0的int变量直接加1,但是这												个时候栈顶元素没有变化,还是0
      14: istore_0 							// 将栈顶元素出栈赋值给局部变量下标0变量 也就												是i。 此时 局部变量 i 又被赋值为0,前面 iinc  											指令对i 的加一操作一样被覆盖
      15: iinc          1, 1
      18: goto          4
      21: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      24: iload_0
      25: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      28: return
}

image.png

在字节码层面是先把 i 加载到操作数栈上,随后才对局部变量 i 执行加一操作 , 留在操作数栈顶的还是 i 的旧值。则这个变量得到的是 i 加一之前的值

++i

public class Test {
    public static void main(String[] args) {
        foo();
    }
    public static void foo() {
       int i = 0;
        for (int j = 0; j < 50; j++) {
            i = ++i;
        }
        System.out.println(i);
    }
}

对应字节码

public class com.yxzapp.Test {
  public com.yxzapp.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method foo:()V
       3: return
  public static void foo();
    Code:
       0: iconst_0
       1: istore_0
       2: iconst_0
       3: istore_1
       4: iload_1
       5: bipush        50
       7: if_icmpge     21
      10: iinc          0, 1                // 对局部变量表表为0的int变量直接加1,
      13: iload_0                           // 把局部变量下标0的变量加载到操作数栈上
      14: istore_0                          // 将栈顶元素出栈赋值给局部变量下标0变量
      15: iinc          1, 1
      18: goto          4
      21: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      24: iload_0
      25: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      28: return
}

可以看出 i= ++i , 先对局部变量表下标为0的变量加 1 ,然后才把它加载到操作数栈上,随后又从操作数栈上出栈赋值给局部变量表中下标为 0 的变量

image.png

总结 

到此这篇关于Java中的递增i++与++i的实现原理详解的文章就介绍到这了,更多相关i++与++i的实现原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文