测试类
package com.company; public class Main { public void testIPlus() { int i = 0; int j = i++; } public void testPlusI() { int i = 0; int j = ++i; } public static void main(String[] args) { } }javap -v 反汇编后
public void testIPlus(); descriptor: ()V flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: iconst_0 将int类型常量0压入栈 1: istore_1 取出栈顶元素存入局部变量1 2: iload_1 把局部变量1压入栈(此时局部变量1的值为0) 3: iinc 1, 1 把一个常量值加到一个int类型的局部变量上 (局部变量1值加1) 6: istore_2 取出栈顶元素存入局部变量2 7: return LineNumberTable: line 6: 0 line 7: 2 line 8: 7 public void testPlusI(); descriptor: ()V flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: iconst_0 将int类型常量0压入栈 1: istore_1 取出栈顶元素存入局部变量1 2: iinc 1, 1 把一个常量值加到一个int类型的局部变量上 (局部变量1值加1) 5: iload_1 把局部变量1压入栈(此时局部变量1的值为0+1) 6: istore_2 取出栈顶元素存入局部变量2 7: return LineNumberTable: line 11: 0 line 12: 2 line 13: 72: iload_1 3: iinc 区别就是这两条指令的执行顺序 i++ 先把i的值压入操作数栈在加一 ++i 先把i加一再把i的值压入操作数栈
局部变量1就是i 局部变量2就是j 局部变量赋值的过程其实是从栈顶取值 这也是为什么导致 i++ 是先执行后加一 ++i 先加一后执行的原因