开发者

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

开发者 https://www.devze.com 2023-11-19 14:09 出处:网络 作者: ゞ浪人与酒丶0
目录前言i++++i总结python 前言 在Java中,i++是一种常见的递增操作符,用于将变量i的值增加1。
目录
  • 前言
  • i++
  • ++i
  • 总结python 

前言

在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  											指令对iandroid 的加一操作一样被覆盖
      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
}

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

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

++i

public class Test {
    public static void main(String[] args) {
        foo();
    }
    public static void foo() {
       int i = http://www.devze.com0;
        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:javascript 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 的变量

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

总结 

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

到此这篇关于Java中的递增i++与++i的实现原理详解的文章就介绍到这了,更多相关i++与++i的实现原理内容请搜索编程客栈(www.devze.com)以http://www.devze.com前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号