b站尚硅谷javase面试题:自增变量 笔记

关于局部变量表和操作数栈就不多讲了,网上有很多内容

 

这里关于a++和++a编译成字节码后的区别做一下测试:

 这是int b = a++

b站尚硅谷javase面试题:自增变量 笔记_第1张图片

int a = 1;

int b = a++;得到字节码

Code:
       0: iconst_1         //将常量1入操作数栈
       1: istore_1          //从操作数栈顶取值,放入局部变量表编号为1的位置 

-------以上字节码完成了对a=1的赋值

       2: iload_1           //将局部变量表中编号为1的位置加载到操作数栈栈顶--->栈顶=1

       3: iinc          1, 1      //局部变变量表编号为1的位置直接+1
       6: istore_2              //从操作数栈顶取值,放入局部变量表编号为2的位置 -->也就是把1赋给局部变量b


       7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      10: iload_2
      11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      14: return

--------------------------------------------------------分割线--------------------------------------------------------------

int a = 1;

int b = ++a;得到字节码
    Code:
       0: iconst_1
       1: istore_1
       2: iinc          1, 1
       5: iload_1
       6: istore_2

       7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      10: iload_2
      11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      14: return

注意颜色标注的那几行

这里直接给结论:

b=a++是将a的值先入操作数栈,然后局部变量表的a自增局部变量表的b从操作数栈取值

b=++a是局部变量表a先自增,然后局部变量表a的值入栈局部变量表的b从操作数栈取值

你可能感兴趣的:(java,开发语言,后端)