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.<init> ()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.<init> ()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.<init> ()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
}
执行结果:
-
i=i++;执行过程分析
-
int j=i++;执行过程分析:
-
int k=i+++i*i++;
小结
- 赋值=,最后计算。
- =右边的从左到右依次加载值依次压入操作数栈。
- 实际先算那个,看运算符的优先级。
- 自增、自减操作都是直接修改变量的值,不经过操作数栈。
- 最后的赋值之前,临时结果也是存储在操作数栈中的。