public class Test {
public static void main(String[] args) {
int i = 1;
i = i++;
}
}
最终i的值仍为1,不知道其中是如何执行的,所以查看了其字节码指令:
Compiled from "Test.java"
public class Test {
public Test();
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_1 // iconst表示将int类型常量加载到操作数栈顶,1表示常量的值
1: istore_1 // istore表示将int类型数值从操作数栈顶取出,并存储到到局部变量表的第1个Slot中,即i中
2: iload_1 // iload表示将int类型变量从局部变量表的第1个Slot中取出,并放到操作数栈顶
3: iinc 1, 1 // iinc表示将局部变量表的第1个Slot中的int类型变量加1
6: istore_1 // istore表示将int类型数值从操作数栈顶取出,并存储到到局部变量表的第1个Slot中,即i中
7: return
}
我好奇的是为什么6:istore_1这步会执行呢?为什么一定会把操作数栈栈顶的值存回局部变量表呢?因为就是这步造成了i=i++最后的奇怪结果
------解决思路----------------------
肯定要写会局部变量表呀,不然原先局部变量表的值是2,然后6:istore_1将操作数栈中的1写回到局部变量表的第一个slot,把原来的2替换掉了。这样才导致最终i的值是1.事实就是这样子,会先store,如果由return的话,在load出来,记住这内部顺序就行,毕竟这是编译器干的事。
------解决思路----------------------
using namespace std;
#include <iostream>
int main(int argc, char **argv){
int i =1;
i=i++;
cout <<i;
return 0;
}
执行这段输出的结果是2。语言规定。