反编译 i++ ,++i,i=i+1区别(修改)

1.(i++,++i)和i=i+1最大的区别

i++和++i使用的时iinc进行自增,i=i+1使用的是iadd操作栈顶和次栈顶元素进行相加

iinc操作的时局部变量表中的数据,iadd操作操作数栈中的数据 。有疑问?就先带着疑问往下看

2.i++和++i的最大区别

i++是先把局部变量表的数据iload到栈顶,然后再进行iinc(操作数栈i=0,局部变量表i=1),++i是先对局部变量表的数据进行iinc再放入操作数栈(操作数栈i=1,局部变量表i=1)。继续往下看

代码:

package com.java;

public class Test11 {
public static void main(String[] args) {
    int i=0;
    i=i++;
}
}

反编译:

0:就是 先将常量0放入栈中
1:将栈顶元素0取出给i
2:   将i的值0推送到栈顶
3:将局部变量表的值进行+1
4:将栈顶元素0赋值给i
因此最终结果 如果打印i 结果是0

如果真的向我们说的i=i++就是i=i;i=i+1  会比上边反编译多一次存栈和取栈的过程  
代码:

public class Test11 {
    public static void main(String[] args) {
        int i=0;
        i=i;
        i=i+1;
    }
}

反编译:

0:将常量0放入栈顶
1:将栈顶0取出给变量i
2:将变量i的值0放入栈顶
3:将栈顶值0给i
4:将变量i的值0放入栈顶
5:将常量1放入栈顶
6:取出栈top元素和top-1元素进行相加得1放入栈顶
7:取出栈顶1给i
因此打印结果i是1

下面我们再看看++i的过程是个什么样
代码:

public class Test11 {
    public static void main(String[] args) {
        int i=0;
        i=++i;
    }
}

反编译截图:

0:将常量0放入栈顶
1:将栈顶元素0给i
2:   将局部变量表的值进行+1
5:将i的值放入栈顶
6:将i的值1赋值给i
因此打印i的结果是1

发布了28 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/sunboylife/article/details/103389670
i++