Java中对i = i++的解释

原创 2015年11月17日 19:10:51

public class Test {

    public static voidmain(String[] args) {

          int i =0;

          i = i++;

         System.out.println(i);

   } 

}

对Test.class文件进行反编译得到的结果:

从0行开始:

    0)code 0 : 执行iconst_0:将int型常量压入操作数栈栈顶位置

    1)code 1:执行istore_1:将操作数栈栈顶元素出栈,并将它存到一个叫局部变量表1的东西上(出栈),此时i的值为0;

    2)code 2:执行iload_1:将局部变量表1的元素放到操作数栈栈顶(入栈);

    3)code 3:执行iinc(递增命令):将常量值1加入到局部变量表1中;注意:这个命令没直接发生在操作数栈中,而是直接在局部变量表1中操作的。个人理解是:这个命令是个综合命令(含iadd和        

        istore),所以此命令结束后,i的值为1。

    6)code 6:执行istore_1:把栈顶的值存在局部变量表1中。这里奇迹出现了:要记得第三步2)操作数栈中栈顶元素为0,执行出栈操作时,栈顶元素0又把刚刚在局部变量表1中的

        值1给覆盖为0了。

    到此,所有的赋值操作都结束了。下面的操作时执行  System.out.println(i) 语句的命令

    

下面讨论下j = i ++的情况:

public class Test {

     public static voidmain(String[] args) {

          int i =0;

          int j =0;

          j = i++;

         System.out.println(i);

     }

}

反编译得到的结果:

    1)code 0 和 code 1命令:对应语句是int i = 0;此时局部变量1值为0;栈顶为空;

    2)code 2 和code 3 命令:对应语句是int j = 0;此时局部变量2值为0;栈顶为空;注意:这个程序有两个局部变量1和2

    3)code 4 命令iload_1:把局部变量1的值放入到操作数栈栈顶位置;

    4)code 5 命令iinc:将常量值1加入到局部变量1中;注意:这个命令没直接发生在操作数栈中,而是直接在局部变量表1中操作的。个人理解是:这个命令是个综合命令(含iadd和        

        istore),所以此命令结束后,i的值为1。

    5)code 8 命令istore_2:把栈顶元素存到局部变量2中;注意:此时栈顶元素值是多少啊?看3)步。

 

 

    大概的情况执行java中执行 i = i++语句,虚拟机中执行命令就是这样的吧。昨晚好像没讲清楚的, 还不清楚的下次讨论++i的命令解释。。。。。记住一点:Java在执行i++时,会先找个地方把i原先的值存下来,算完++后,又把原先存下来的值覆盖到++后的值。。。。。(个人观点)

题外话:这个问题好像就Java中有的,c/c++中好像没的。

 

 

 

 

 

 

 

 

 

 

 

 

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

Java中关于i=i++的正确解释方法

Java中关于i=i++的正确解释方法
  • shaogaige
  • shaogaige
  • 2016年01月29日 19:31
  • 1189

java中i++ 与 i=i++的区别

记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++与++i,i++表示的是先赋值后加1,++i是先加1后赋值。...
  • wangmaohong0717
  • wangmaohong0717
  • 2017年02月04日 17:32
  • 992

Java中i++和++i的区别

说来惭愧,从事开发工作也有一年时间了,然而在今天的一个业务逻辑里突然发现原来我对i++和++i都没有理解,或者说我之前的理解是错误的。这对于一个有追求的程序猿是不能容忍的。知道之后,迅速恶补学习,现在...
  • qq_34471736
  • qq_34471736
  • 2017年01月18日 11:41
  • 3895

java中的i++ 和 ++i 以及 for循环

今天在看java的i++  和++i 的区别,感觉自己还是会绕。正好整理下。 i++:先赋值,后计算; ++i;先计算,后赋值。 看下面代码:public class Text { public s...
  • allenjay11
  • allenjay11
  • 2016年04月14日 21:14
  • 2870

Java中i=i++;运算结果

今天看到一个题,结果和原本想的不太一样,也有些意思,同时也深入地考虑到更多情况。 原本的题大体如下, 以下程序的输出结果是什么? Class Test{   public static void ma...
  • zqs62761130
  • zqs62761130
  • 2015年02月02日 10:20
  • 750

浅谈java之++i和i++区别

浅谈java之++i和i++区别                   今天简单谈谈关于java的一个误区,相信很多刚开始学习java的朋友都会遇到这个问题,虽然问题很简单,但是经常容易搞混,说说jav...
  • u011747761
  • u011747761
  • 2015年01月09日 16:31
  • 10874

深入理解Java中的i++、++i语句

在几乎所有的命令式编程语言中,必然都会有i++和++i这种语法。在编程启蒙教材《C语言程序设计》一书中,也专门解释了这两条语句的区别。有些语言中i++和++i既可以作为左值又可以作为右值,笔者专门测试...
  • xialei199023
  • xialei199023
  • 2017年07月30日 14:36
  • 987

java i++和++i的区别

//i++和++i是有区别的, //i++和++i都代表着i=i+1; //i++是在一个先使用原值,然后加1,即先使用i的值,后让i+1. //++i则是先加1后使用,即先让i+1后再使用i的新值....
  • q2267671366
  • q2267671366
  • 2014年12月23日 14:36
  • 2687

++i 和 i++ 的理解

C语言初学者易理解错误的自增运算符
  • hongdeng123
  • hongdeng123
  • 2016年08月30日 20:47
  • 11308

java面试题:i=i++和j=i++两句分别输出i=?,j=?

package 网易校招面试题; public class Inc { public static void main(String[] args) { Inc inc = new Inc()...
  • u012110719
  • u012110719
  • 2015年07月28日 10:42
  • 1736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中对i = i++的解释
举报原因:
原因补充:

(最多只允许输入30个字)