zoukankan      html  css  js  c++  java
  • i++ 和 ++i的字节码指令

    代码

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

    System.out.println(i);
    }

    }

    输出 0 , 说实话我第一看也打错了,看看字节码

    public class Test {
    public Test();
    Code:
    0: aload_0
    1: invokespecial #1 // Method java/lang/Object."<init>":
    ()V
    4: return

    public static void main(java.lang.String[]);
    Code:
    0: iconst_0
    1: istore_1
    2: iload_1
    3: iinc 1, 1
    6: istore_1
    7: getstatic #2 // Field java/lang/System.out:Ljava/
    io/PrintStream;
    10: iload_1
    11: invokevirtual #3 // Method java/io/PrintStream.printl
    n:(I)V
    14: return
    }

    指令3 iinc 1,1 直接+1到第二个变量i 中,这时候i=1;

    再执行istore_1 把操作数栈写回到变量i, 这时候i又变成0

    我们把代码改改

    public class Test{
    public static void main(String args[]){
    int i=0;
    //i=i++;
    i=i+1;
    System.out.println(i);
    }

    }

    字节码指令

    Compiled from "Test.java"
    public class Test {
    public Test();
    Code:
    0: aload_0
    1: invokespecial #1 // Method java/lang/Object."<init>":
    ()V
    4: return

    public static void main(java.lang.String[]);
    Code:
    0: iconst_0
    1: istore_1
    2: iload_1
    3: iconst_1
    4: iadd
    5: istore_1
    6: getstatic #2 // Field java/lang/System.out:Ljava/
    io/PrintStream;
    9: iload_1
    10: invokevirtual #3 // Method java/io/PrintStream.printl
    n:(I)V
    13: return
    }

    i=i+1 执行的是iadd指令,这是操作数栈里的字节码指令,把新值1压入到操作数栈,再执行istore_1 把操作数栈回写到变量i, 于是i变成了1

  • 相关阅读:
    Linux的ftp和www的服务器在虚拟机上的搭建
    Android中ViewPager
    Vue学习中踩的坑
    MySQL性能优化
    从Java内存模型讲双重检查锁原理
    JAVA8新特性学习
    JAVA中使用openoffice将Excel转PDF再转图片功能实现
    netty自定义协议上传
    poi-tl生成Word
    gitlab搭建
  • 原文地址:https://www.cnblogs.com/devilwind/p/8643415.html
Copyright © 2011-2022 走看看