package algorithms.com.guan.javajicu; public class Inc { public static void main(String[] args) { Inc inc = new Inc(); int i = 0; inc.fermin(i); i= i ++; System.out.println(i); } void fermin(int i){ i++; } }
这个问题可以简化为:
int i=0; i=i++; System.out.println(i);
问题的关键在于i=i++;是怎么运算的。首先++运算符的优先级高于=。因此首先执行i++,表达式返回值为0,但注意此时i++还未执行完,i自增为1。然后将表达式i++的返回值赋值给i,此时i又变成了0。 查看字节码就能明白:
0: iconst_0 //字面常量0入栈 1: istore_1 //将栈顶的0值取出保存在局部变量表位置1中 2: iload_1 //将局部变量表位置1的int值0入栈 3: iinc 1, 1 //将局部变量表位置1的int值增加1 6: istore_1 //将栈顶的0值取出保存在局部变量表位置1中 7: getstatic #2 // Field java/lang/System.out 10: iload_1 11: invokevirtual #3 // Method java/io/PrintStream.println 14: return
强哥说,i++实现原理: int getI(int &i){ int temp = i; i++; return temp; } 注意这里写成 &i 是为了说明不是传值
inc.fermin(i);