【Java高频面试题】--Java运算执行流程分析

1. Java高频面试题(一)-- Java运算执行流程分析

    public static void main(String[] args) {
        int i=1;

        i=i++;

        int j=i++;

        int k=i+++i*i++;

        System.out.println("i="+i);
        System.out.println("j="+j);
        System.out.println("k="+k);
    }

相应字节码:

// access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 13 L0
    ICONST_1
    ISTORE 1
   L1
    LINENUMBER 15 L1
    ILOAD 1
    IINC 1 1
    ISTORE 1
   L2
    LINENUMBER 17 L2
    ILOAD 1
    IINC 1 1
    ISTORE 2
   L3
    LINENUMBER 19 L3
    ILOAD 1
    IINC 1 1
    ILOAD 1
    ILOAD 1
    IINC 1 1
    IMUL
    IADD
    ISTORE 3
   L4
    LINENUMBER 21 L4
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder. ()V
    LDC "i="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ILOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L5
    LINENUMBER 22 L5
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder. ()V
    LDC "j="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ILOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L6
    LINENUMBER 23 L6
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder. ()V
    LDC "k="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ILOAD 3
    INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L7
    LINENUMBER 24 L7
    RETURN
   L8
    LOCALVARIABLE args [Ljava/lang/String; L0 L8 0
    LOCALVARIABLE i I L1 L8 1
    LOCALVARIABLE j I L3 L8 2
    LOCALVARIABLE k I L4 L8 3
    MAXSTACK = 3
    MAXLOCALS = 4
}

执行结果:
【Java高频面试题】--Java运算执行流程分析_第1张图片

  • i=i++;执行过程分析
    【Java高频面试题】--Java运算执行流程分析_第2张图片

  • int j=i++;执行过程分析:
    【Java高频面试题】--Java运算执行流程分析_第3张图片

  • int k=i+++i*i++;
    【Java高频面试题】--Java运算执行流程分析_第4张图片

小结

  • 赋值=,最后计算。
  • =右边的从左到右依次加载值依次压入操作数栈。
  • 实际先算那个,看运算符的优先级。
  • 自增、自减操作都是直接修改变量的值,不经过操作数栈。
  • 最后的赋值之前,临时结果也是存储在操作数栈中的。

你可能感兴趣的:(Java高频面试题)