热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

当时学习的时候碰到的Java关于i=i++问题解答

inti0;ii;结果i是多少?这是一个经常被提及的问题,答案一直五花八门。具体测试一下以说明问题:代码1:publiccl

      int i=0;
      i=i++;
      结果i是多少?
      这是一个经常被提及的问题,答案一直五花八门。
      具体测试一下以说明问题: 
      代码1:

  1. public class Test{
  2.     public static void main(String[] args){
  3.          int i=0;
  4.          i=i++;
  5.          System.out.println(i);
  6.     }
  7. }

     结果i依然是0.分析其反编译后的代码: 
    

  1. public static void main(java.lang.String[]);
  2.   Code:
  3.    0:   iconst_0     //0放到栈顶
  4.    1:   istore_1    //把栈顶的值保存到局部变量1,也就是i中
  5.    2:   iload_1     //把i的值放到栈顶,也就是说此时栈顶的值是0
  6.    3:   iinc    11  //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
  7.    6:   istore_1     //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
  8.    7:   getstatic   #2//Field java/lang/System.out:Ljava/io/PrintStream;
  9.    10:  iload_1
  10.    11:  invokevirtual   #3//Method java/io/PrintStream.println:(I)V
  11.    14:  return

值得注意到是i被修改了两次,第一次是i++;i变为1,最后一次是i=0;所以结果i是0
代码2:

  1. public class Test2{
  2.     public static void main(String[] args){
  3.          int i=0;
  4.          int j=0;
  5.          j=i++;
  6.          System.out.println(i);
  7.          System.out.println(j);
  8.     }
  9. }

这个结果肯定都知道,i是1,j是0.同样看反编译之后的代码: 

  1. public static void main(java.lang.String[]);
  2.   Code:
  3.    0:   iconst_0
  4.    1:   istore_1     //i=0
  5.    2:   iconst_0
  6.    3:   istore_2     //j=0
  7.    4:   iload_1      //把i的值放到栈顶,也就是说此时栈顶的值是0
  8.    5:   iinc    11  //局部变量1加1,也就是让i++了,此时i已经是1了,上面说过,此指令不会导致栈变化
  9.    8:   istore_2     //把栈顶的值(注意是0)存入局部变量2,也就是j中,所以j=0
  10.    9:   getstatic   #2//Field java/lang/System.out:Ljava/io/PrintStream;
  11.    12:  iload_1
  12.    13:  invokevirtual   #3//Method java/io/PrintStream.println:(I)V
  13.    16:  getstatic   #2//Field java/lang/System.out:Ljava/io/PrintStream;
  14.    19:  iload_2
  15.    20:  invokevirtual   #3//Method java/io/PrintStream.println:(I)V
  16.    23:  return

很明显可以看出,Java是先把i的值取出来放到栈顶,我们可以认为是引入了第三个变量int k=i;然后i++,这时候i为1了,然后让j=k;也就是0.结论,i的++运算是在对j这个变量的赋值之前完成的。

代码3:

  1. public class Test3{
  2.     public static void main(String[] args){
  3.          int i=0;
  4.          int j=0;
  5.          j=++i;
  6.          System.out.println(i);
  7.          System.out.println(j);
  8.     }
  9. }

结果大家也都知道,i=1,j=1
看操作过程: 

  1. public static void main(java.lang.String[]);
  2.   Code:
  3.    0:   iconst_0    
  4.    1:   istore_1    //i=0
  5.    2:   iconst_0
  6.    3:   istore_2     //j=0
  7.    4:   iinc    11   //局部变量i加1,这时候i变成1了 。
  8.    7:   iload_1     //把i的值放到栈顶,栈顶的值是1
  9.    8:   istore_2    //j=1
  10.    9:   getstatic   #2//Field java/lang/System.out:Ljava/io/PrintStream;
  11.    12:  iload_1
  12.    13:  invokevirtual   #3//Method java/io/PrintStream.println:(I)V
  13.    16:  getstatic   #2//Field java/lang/System.out:Ljava/io/PrintStream;
  14.    19:  iload_2
  15.    20:  invokevirtual   #3//Method java/io/PrintStream.println:(I)V
  16.    23:  return

对比代码2和代码3,关键的差别就是iload_1   个iinc这两条指令的位置变了。

 

 

当然:如果在C++中:上边的代码 运行结果必定是a=10.


转自:

http://blog.csdn.net/ZangXT/archive/2008/11/05/3229281.aspx


推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
author-avatar
没什么65丶1_750
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有