美文网首页
你真的理解i++和++i吗?

你真的理解i++和++i吗?

作者: Map_Reduce | 来源:发表于2019-07-21 14:28 被阅读0次

代码1

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

输出结果:i=0
明明进行i++了,但是输出结果为什么是0呢?
其实直接看代码,理解起来是比较抽象的,那么我们就一起来看看底层到底是怎么赋值的。
.class文件反编译后:

Code:
      stack=3, locals=2, args_size=1
         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: new           #3                  // class java/lang/StringBuilder
        13: dup
        14: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        17: ldc           #5                  // String i =
        19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        22: iload_1
        23: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        26: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        29: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        32: return
      LineNumberTable:
        line 7: 0
        line 9: 2
        line 11: 7
        line 14: 32
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      33     0  args   [Ljava/lang/String;
            2      31     1     i   I

解释

0: iconst_0             //给变量i赋值为0
1: istore_1             //将i存储到Slot1(槽点)的位置
2: iload_1              //将Slot1位置上的i加载到栈顶
3: iinc        1, 1    //将Slot1位置上的i进行加1,此时进行的是i++操作,此时Slot1位置中的i变为1
6: istore_1            //又将栈顶的i=0 存储到了Slot1,所有Slot1位置中的i又从1变为了0
22: iload_1           //加载Slot1位置的i到栈顶,此时i=0

代码2

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

输出结果:i=1

.class文件反编译后:

 Code:
      stack=3, locals=2, args_size=1
         0: iconst_0
         1: istore_1
         2: iinc          1, 1
         5: iload_1
         6: istore_1
         7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        10: new           #3                  // class java/lang/StringBuilder
        13: dup
        14: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        17: ldc           #5                  // String i =
        19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        22: iload_1
        23: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        26: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        29: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        32: return
      LineNumberTable:
        line 7: 0
        line 9: 2
        line 11: 7
        line 14: 32
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      33     0  args   [Ljava/lang/String;
            2      31     1     i   I

不解释了-_-.....

相关文章

  • 你真的理解i++和++i吗?

    代码1 输出结果:i=0明明进行i++了,但是输出结果为什么是0呢?其实直接看代码,理解起来是比较抽象的,那么我们...

  • 我认为你并不理解i++和++i

    阅读原文: 你可能并不理解i++和++i 面对i++和++i,是不是经常忘记两者的区别?你是真的理解它还是只是靠死...

  • 深度理解 i++ 和 ++i

    我们都知道 i++ 与 ++i 都是自增操作。大多数也知道两种 "先加" 和 "后加的区别"。例如下方代码: 打印...

  • 你真的清楚 i = i++和 i = ++i 的区别吗?

    前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛...

  • 深入理解i++和++i

    看一段代码: i最后的结果为0,如果换成++i,i最后的结果就是1; 这个现象我相信很多人很容易解释。 1、前置+...

  • 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吗?

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