有段代码

 public static void test(){
        int a=1,b=1,c=1,d=1;
        a++;
        ++b;
        c=c++;
        d=++d;
        System.out.println(a+"\t"+b+"\t"+c+"\t"+d);
    }

结果是2 2 1 2

对应的指令是

对于单纯的a++和++b,指令都是把所在slot的值+1,即编译时认为等同于+1

而对于c=c++,如14、15、18对应的指令,对于c++来说,是先从slot中取值加载到栈顶,然后把slot的值+1,而对于c=即是把工作内存中到值的变量副本放回slot中,便是把2覆盖成1了

而对于d=d++,如19、22、23对应的指令,对于++d来说,是把slot的值先+1,然后取值加载到栈顶,而对于d=即是把刚取到到值又放回slot去

 

posted on 2017-12-23 16:43  一个人的合唱  阅读(170)  评论(0编辑  收藏  举报