前言如果只用普通的知识来解释i++和++i,那么i++先给i赋值然后++++i先++再赋值,但是这种简单的回答并没有引起面试官的注意。如果用javaBytecode指令分析,效果就完全不一样了。代码实现publicclassOperandStackTest{/**程序员面试过程中,i++和++i的常见区别*/publicstaticvoidadd(){//第1类问题:inti1=10;i1++;System.out.println(i1);//11inti2=10;++i2;System.out.println(i2);//11//类型2问题:inti3=10;inti4=i3++;System.out.println(i3);//11System.out.println(i4);//10inti5=10;inti6=++i5;System.out.println(i5);//11System.out.println(i6);//11//输入3题:inti7=10;i7=i7++;System.out.println(i7);//10inti8=10;i8=++i8;系统输出。println(i8);//11//类型4问题:inti9=10;inti10=i9+++++i9;//10+12System.out.println(i9);//12System.out.println(i10);//22}publicstaticvoidmain(String[]args){add();}}runresult字节码指令通过javap-vout目录下class文件名在终端运行得到如下结果publicstaticvoidadd();描述符:()Vflags:ACC_PUBLIC,ACC_STATICCode:stack=2,locals=10,args_size=00:bipush102:istore_03:iinc0,16:getstatic#4//字段java/lang/System.out:Ljava/io/打印流;9:iload_010:invokevirtual#5//方法java/io/PrintStream.println:(I)V13:bipush1015:istore_116:iinc1,119:getstatic#4//字段java/lang/System.输出:Ljava/io/PrintStream;22:iload_123:invokevirtual#5//方法java/io/PrintStream.println:(I)V26:bipush1028:istore_229:iload_230:iinc2,133:istore_334:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;37:iload_238:invokevirtual#5//方法java/io/PrintStream.println:(I)V41:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;44:iload_345:invokevirtual#5//方法java/io/PrintStream.println:(I)V48:bipush1050:istore452:iinc4,155:iload457:istore559:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;62:iload464:invokevirtual#5//方法java/io/PrintStream.println:(I)V67:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;70:iload572:invokevirtual#5//方法java/io/PrintStream.println:(I)V75:bipush1077:istore679:iload681:iinc6,184:istore686:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;89:iload691:invokevirtual#5//方法java/io/PrintStream.println:(I)V94:bipush1096:istore798:iinc7,1101:iload7103:istore7105:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;108:iload7110:invokevirtual#5//方法java/io/PrintStream.println:(I)V113:bipush10115:istore8117:iload8119:iinc8,1122:iinc8,1125:iload8127:iadd128:istore9130:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;133:iload8135:invokevirtual#5//方法java/io/PrintStream.println:(I)V138:getstatic#4//字段java/lang/System.out:Ljava/io/PrintStream;141:iload9143:invokevirtual#5//Methodjava/io/PrintStream.println:(I)V146:return解释上面的操作结果第一类问题对应的指令是先将i1的值push到入栈(bipush),然后将栈中int类型的值存入局部变量表0的位置,然后执行iinc将0位置的值加1,然后将局部变量0位置的值压入table入栈执行输出操作,所以i1的值为11,先将i2的值压入栈(bipush),然后将栈中int类型的值存入局部变量table1的位置.,然后执行iinc将1位置的值加1,然后将局部变量表1位置的值压入栈执行输出操作,所以i2的值为11.总结由于有没有赋值操作,区别不大把它存到局部变量表2的位置,然后压栈,执行iinc把位置2的值加一,把i4存到局部表3的位置,所以i3是11,i4还是10,把i5压入栈,存放在本地变量表4的位置,既然是++i,先用iinc把位置4的值加1,然后压入local的值变量表4入栈,执行赋值操作,所以全为11。第三类题是先将i7入栈,然后存入局部变量表6,先把i6压栈,然后给6处的值加1,由于这个值存入局部变量表6,所以发生覆盖,值变成10。而++i不会产生overwrite,先加1再压栈,赋值给局部变量表,所以i8为11。第四类题先压i9=10入栈,然后局部变量表第8位有inti10=i9+++++i9;先iload把8位的i9压栈,然后执行iinc给8位的i9加1,然后执行++i9,给8位的i9加1,那么i9=10+1+1就是12,然后将第8位的i9压入栈中,执行add将栈中的两个i9相加,将得到的值存入局部变量表9的位置,所以i10=10+12(i9++后10,++后12i9,因为进行了两次iinc操作)然后调用虚方法和静态方法,然后将9处的值压栈执行输出语句
