从字节码角度分析a++相关题目

源码:

package cn.itcast.jvm.t3.bytecode;
/**
* 从字节码角度分析 a++ 相关题目
*/
public class Demo3_2 {
  public static void main(String[] args) {
    int a = 10;
    int b = a++ + ++a + a--;
    System.out.println(a);
    System.out.println(b);
 }
}

结果为34,11。

分析:

iinc 指令是直接在局部变量 slot 上进行运算
a++ 和 ++a 的区别是先执行 iload 还是 先执行 iinc

字节码:

public static void main(java.lang.String[]);
 descriptor: ([Ljava/lang/String;)V
 flags: (0x0009) ACC_PUBLIC, ACC_STATIC
 Code:
  stack=2, locals=3, args_size=1
    0: bipush    10     //10入操作数栈
    2: istore_1         //从操作数栈的栈顶获取一个值赋值到局部变量表的1号位置,对应a=10。
    3: iload_1            //将局部变量表的1号位置的值加载到操作数栈中
    4: iinc     1, 1        //局部变量表的1号位置的值,加一次1。3和4对应a++
    7: iinc     1, 1        //7和10对应++a。
   10: iload_1
   11: iadd
   12: iload_1
   13: iinc     1, -1
   16: iadd
   17: istore_2

  21: iload_1
   22: invokevirtual #3         // Method
java/io/PrintStream.println:(I)V
   25: getstatic   #2         // Field
java/lang/System.out:Ljava/io/PrintStream;
   28: iload_2
   29: invokevirtual #3         // Method
java/io/PrintStream.println:(I)V
   32: return
  LineNumberTable:
   line 8: 0
   line 9: 3
   line 10: 18
   line 11: 25
   line 12: 32
  LocalVariableTable:
   Start Length Slot Name  Signature
     0   33   0 args  [Ljava/lang/String;
     3   30   1   a  I
     18   15   2   b  I

猜你喜欢

转载自blog.csdn.net/Mrrr_Li/article/details/121399938
今日推荐