美文网首页
重学 i++ 和++i

重学 i++ 和++i

作者: fyg | 来源:发表于2022-08-16 10:34 被阅读0次

public void calc(){
        int i = 1;
        i = i++;
        System.out.println(i);
    }

对应的字节码指令如下:

calc:()V
000:    iconst_1                                {Lsample/HelloWorld;, .} | {}
001:    istore_1                                {Lsample/HelloWorld;, .} | {I}
002:    iload_1                                 {Lsample/HelloWorld;, I} | {}
003:    iinc 1 1                                {Lsample/HelloWorld;, I} | {I}
004:    istore_1                                {Lsample/HelloWorld;, I} | {I}
005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {}
006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;}
007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
008:    return                                  {Lsample/HelloWorld;, I} | {}


public void calc(){
        int i = 1;
        i = ++i;
        System.out.println(i);
    }


对应的字节码指令如下:

calc:()V
000:    iconst_1                                {Lsample/HelloWorld;, .} | {}
001:    istore_1                                {Lsample/HelloWorld;, .} | {I}
002:    iinc 1 1                                {Lsample/HelloWorld;, I} | {}
003:    iload_1                                 {Lsample/HelloWorld;, I} | {}
004:    istore_1                                {Lsample/HelloWorld;, I} | {I}
005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {}
006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;}
007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
008:    return                                  {Lsample/HelloWorld;, I} | {}
iload istore image.png iinc.png

指定包名,统计方法耗时


//代码

public void calc(){
        int i = 1;
        i = i++;
        System.out.println(i);
    }

//对应的字节码指令如下
calc:()V
000:    iconst_1                                {Lsample/HelloWorld;, .} | {I}
001:    istore_1                                {Lsample/HelloWorld;, I} | {}
002:    iload_1                                 {Lsample/HelloWorld;, I} | {I} //把局部变量表索引为1位置的值   放到操作数栈中  (操作数栈顶元素的值为 1)
003:    iinc 1 1                                {Lsample/HelloWorld;, I} | {I} //把局部变量表索引为1位置的值加1  (局部变量表该位置的值 i=2)
//栈顶元素弹栈并把值(栈顶元素的值为1)存到局部变量表索引为1的位置(局部变量表索引为1位置的值由2变为1)
004:    istore_1                                {Lsample/HelloWorld;, I} | {}  
005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;} 
006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {}
008:    return                                  






//代码

public void calc(){
        int i = 1;
        i = ++i;
        System.out.println(i);
    }
//对应的字节码指令如下
calc:()V
000:    iconst_1                                {Lsample/HelloWorld;, .} | {I}
001:    istore_1                                {Lsample/HelloWorld;, I} | {}  
002:    iinc 1 1                                {Lsample/HelloWorld;, I} | {} //把局部变量表索引为1位置的值加1 (i = 2)
003:    iload_1                                 {Lsample/HelloWorld;, I} | {I}//把局部变量表索引为1位置的值放到操作数栈中(栈顶元素值为2)
//栈顶元素弹栈并把值(栈顶元素的值为2)存到局部变量表索引为1的位置(局部变量表索引为1位置的值由1变为2)
004:    istore_1                                {Lsample/HelloWorld;, I} | {}
005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;}
006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {}
008:    return                                  



相关文章

  • 重学 i++ 和++i

    指定包名,统计方法耗时[https://github.com/fuyuguang/traceSlowMethod]

  • Java中的i++ 和 ++i 在for循环使用

    Java的i++ 和++i 的区别i++:先赋值,后计算;++i;先计算,后赋值。 for循环中的i++和++i...

  • i++和++i

    i++ 先赋值后相加 //结果65 ++i 先自加后赋值 //结果66

  • ++i和i++

    ++i和i++ 如果是自身使用,没有任何区别。 使用后再进行赋值时有区别: 前加:先自身+1再把结果赋值给...

  • i++和++i

    java场景一 打印结果: i: 0 j: 1 java场景二 打印结果: i: 0 j: 1

  • ++i和i++

    1.a = i++; 等校为 a = i; i = i + 1; 2.a = ++i; 等校为 i = i ...

  • i++和++i的区别

    i++和++i有哪些区别? i++和++i都是实现变量i的自增,两者的区别在于i++是先运算,再加1,而++i是先...

  • 自增、赋值运算符

    1.自增 int i = 3; int a = i++ + i++ + i++;//第①个i++表达是值为3,i=...

  • 进程和内存的桥梁——页表技术(x86-64Linux下)

    其实这篇文章是printf("%d%d%d",i++,i++,i++)的后续。 需要注意的名词: 地址空间和内存空...

  • C语言:乱

    ++i 和 i++ 的作用相当于 i=i+1。但是 ++i 和 i++ 的不同之处在于 ++i 是先执行 i=i+...

网友评论

      本文标题:重学 i++ 和++i

      本文链接:https://www.haomeiwen.com/subject/rbergrtx.html