posts - 19,comments - 3,views - 6727

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

1
2
3
4
5
6
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,但结果却为:

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

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

1
2
3
4
int i=1
int temp = i;
i = i+1;
i = temp;

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

1
2
3
int i=1;
int j=i++;
//等价于<br>int i=1;<br>int temp = i;<br><em id="__mceDel"><em id="__mceDel">i = i+1;<br><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">j = temp;</em></em></em></em><br></em></em>

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

1
2
i=i;
i=i=1;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stack=1, locals=2, args_size=1<br>    //int i=1;
         0: iconst_1        //常量值1
         1: istore_1        //将常量1存入变量i中,入栈<br>    //i=i++
         2: iload_1         //开辟一块内存空间加载i值,temp=i=1
         3: iinc          1, 1   //i自增为2
         6: istore_1         //将temp的值存入变量i中,i仍为1<br>    //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

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

  

posted on   liyou555  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示