从字节码的角度进行分析,最重要的是x = x++;,执行的字节码指令是
iload_x 将局部变量表中的x槽位号中的0读取,加载到栈中
iinc x,1 将局部变量表中的x自增
istore_x,相当于把栈中压入栈的x=0,重新覆盖到原先局部变量表中的x槽位,相当于x = 0
循环执行这段指令,最后结果也一定是0
这个问题可以简化为:
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);