之前我们常说的i++是先自增后操作,++i则是先操作后自增,运行一下代码:

int i=1;
System.out.println("初始i值:"+i);
i=i++;
System.out.println("i++后i值:"+i);
i=++i;
System.out.println("++i后i值:"+i);

    想着应该是1,2,3,但结果却为:

初始i值:1
i++后i值:1
++i后i值:2

 其实在执行i=i++的过程中,是先找了一个临时变量temp存储i,而后将i+1赋给i,再将temp赋给i,即:

int i=1;
int temp = i;
i = i+1;
i = temp;

   为了区分两个i,也可以写成下面的形式:

int i=1;
int j=i++;
//等价于
int i=1;
int temp = i;
i = i+1;
j = temp;

   而在执行i=++i时,是将i(1)原地赋值给i后,进行了自增的操作,即

i=i;
i=i=1;

 这主要与JVM有关,在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,反汇编代码:

stack=1, locals=2, args_size=1
    //int i=1; 0: iconst_1        //常量值1 1: istore_1        //将常量1存入变量i中,入栈
    //i=i++ 2: iload_1         //开辟一块内存空间加载i值,temp=i=1 3: iinc 1, 1   //i自增为2 6: istore_1         //将temp的值存入变量i中,i仍为1
    //i=++i; 7: iinc 1, 1   //将i自增为2 10: iload_1          //将自增后的i入栈 11: istore_1          //加载栈顶的i并重新赋给i,此时i为2 12: return LineNumberTable: line 3: 0 line 5: 2 line 7: 7 line 10: 12

  上面的汇编代码,我理解的不算太好,应该是有点问题的,不过程序代码可参考上面写的去理解

 

小tips:

  查看汇编代码,命令行cmd

javac Main.java
javap -c -v Main.class

  

posted on 2023-11-14 11:22  liyou555  阅读(27)  评论(0编辑  收藏  举报