欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM层面的i++和++i——不一样的解答

程序员文章站 2024-01-26 10:02:04
...

直接上代码

public class Demo {
        public void testIPlus() {
            int i = 0;
            int j = i++;
        }

        public void testPlusI() {
            int i = 0;
            int j = ++i;
        }
        
}

查看字节码文件

public void testIPlus();
    descriptor: ()V
            flags: ACC_PUBLIC
            Code:
            stack=1, locals=3, args_size=1
            0: iconst_0
            1: istore_1
            2: iload_1
            3: iinc          1, 1
            6: istore_2
            7: return
            LineNumberTable:
            line 3: 0
            line 4: 2
            line 5: 7

public void testPlusI();
        descriptor: ()V
        flags: ACC_PUBLIC
        Code:
        stack=1, locals=3, args_size=1
        0: iconst_0
        1: istore_1
        2: iinc          1, 1
        5: iload_1
        6: istore_2
        7: return
        LineNumberTable:
        line 8: 0
        line 9: 2
        line 10: 7
        }

分析:先给出字节码含义
JVM层面的i++和++i——不一样的解答

i++:

	 0: iconst_0//常量0
         1: istore_1//将常量0赋值给变量1即i
         2: iload_1//将第一个变量i压入栈
         3: iinc          1, 1//i自增1,这里栈中的i并没有变化
         6: istore_2//将栈中的i付给第二个参数即j

++i:

0: iconst_0 //常量0
1: istore_1//将常量0赋值给变量1即i
2: iinc          1, 1//i自增1,此时i还没有入栈
5: iload_1//将第一个变量i压入栈 此时i已经自增
6: istore_2//将栈中的i赋值给第二个参数即j

总结:i++先入栈,再在自己的空间中自增,不会引起栈中的变量变化,然后在返回
++i先自增,在入栈,然后出栈,栈中的值已经自增过

相关标签: Java基础

上一篇: 安装webpack的步骤教程

下一篇: