记录一下,省的面试的时候问到,虽然小儿科。
代码如下:
public class TestDizeng {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 0,j=0,m=0;
j=i++;
System.out.println(j);
m=++i;
System.out.println(m);
}
}
找到编译后的class文件,cmd 进入所在的文件夹
执行以下命令:
javap -c TestDizeng >>log.txt
将反编译后的字节码指令存储到log.txt文件中,
文件内容如下:
Compiled from "TestDizeng.java"
public class zxl.TestDizeng {
public zxl.TestDizeng();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 // load the int value 0 onto the stack //0 入栈
1: istore_1 // store int value into variable 1 //0 出栈给变量i
2: iconst_0 // load the int value 0 onto the stack //0 入栈
3: istore_2 // store int value into variable 2 //0 出栈给变量j
4: iconst_0 // load the int value 0 onto the stack //0 入栈
5: istore_3 // store int value into variable 3 //0 出栈给变量m
6: iload_1 // load an int value from local variable 1 //将变量i的值入栈
7: iinc 1, 1 //increment local variable #index by signed byte const//直接修改变量i的值加1
10: istore_2 //store int value into variable 2//将栈顶的值给变量j,此时栈顶的值是0
11: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
14: iload_2 //load an int value from local variable 2//将变量j的值入栈
15: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
18: iinc 1, 1 //变量i的值+1,直接修改变量,并没有出栈入栈的操作
21: iload_1 //i的值入栈 ,此时是2
22: istore_3 //将栈顶的值(2) 赋给变量m
23: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
26: iload_3 //m的值入栈,此时是2
27: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
30: return
}
从第6行到第27行,可以看到
j=i++ 先将i 的值入栈,此时是0 ,然后直接修改变量i的值+1 此时i变成了1,然后再把栈顶的值给变量j,此时栈顶的值是0 所以j 是0
m=++i 先直接将变量i的值=1 ,此时i变成了2 ,然后再将i 的值入栈,栈顶的值再给变量m,所以m 的值是2.