当前位置: 代码迷 >> J2SE >> i = i++与字节码指令解决思路
  详细解决方案

i = i++与字节码指令解决思路

热度:77   发布时间:2016-04-23 20:01:46.0
i = i++与字节码指令
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出来,记住这内部顺序就行,毕竟这是编译器干的事。
------解决思路----------------------
引用:
语言这么规定的,c/c++里面i =2, java里面i=1。


using namespace std;
#include <iostream>

int main(int argc, char **argv){
int i =1;
i=i++;
cout <<i;
return 0;
}

执行这段输出的结果是2。语言规定。
  相关解决方案