`
jveqi
  • 浏览: 313385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由++i和 i++想到的

    博客分类:
  • j2ee
阅读更多

1、例子程序,试想打印几,为什么?

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

 

 

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

 2、对了,没错,如您所想。第一个打印8, 第二个打印9 。

 3、究其原理,从它们的字节码说起吧

第一个程序,main方法的字节码指令如下:

 i++

 0 bipush 8
 2 istore_1     //将栈顶int型数值存入第二个本地变量
 3 iload_1      //将第二个int型本地变量推送至栈顶
 4 iinc 1 by 1  // 局部变量自增指令:iinc
 7 istore_1     //  将栈顶int型数值存入第二个本地变量
 8 getstatic #2 <java/lang/System.out>
11 iload_1
12 invokevirtual #3 <java/io/PrintStream.println>
15 return

 第二个字节码指定如下:

++1

 0 bipush 8
 2 istore_1    //  将栈顶int型数值(8)存入第二个本地变量
 3 iinc 1 by 1 / 局部变量自增指令:iinc (8+1)
 6 iload_1     //将第二个int型本地变量推送至栈顶
 7 istore_1    //  将栈顶int型数值(9)存入第二个本地变量
 8 getstatic #2 <java/lang/System.out>
11 iload_1
12 invokevirtual #3 <java/io/PrintStream.println>
15 return

 比较可知,结果不同因为 “iinc 1 by 1 、iload_1”指令的顺序不同,一个是把局部变量表的值先自增(局部变量自增指令:iinc),iload_1 是将第二个int型本地变量推送至栈顶。另一个是将本地变量表变量+1后,压入栈顶,再存入第二个本地变量

 

4、常用字节码指令见https://www.cnblogs.com/tenghoo/p/jvm_opcodejvm.html

分享到:
评论

相关推荐

    matlab提取文件要素代码-web-scraping-for-researchers:按Cmd+Alt+I

    I 多年来,我为定量研究人员举办了两个小时的实践课程,涉及正则表达式(请参阅参考资料)。 今年,我还被要求介绍一些基本的Web抓取技术。 这让我开始思考-进行网页抓取的最佳工具是什么? 这些也是最好的教学工具...

    DS918+6.21二合一硬盘镜像(完美运行,主板必须改为UEFI).7z

    今天我挨个测试了一下个,最终还是觉得这个版本不错,第一系统反应快,第二最牛掰得就是稳定,稳定运行了2年了,以为其它系统会很好,没想到折腾了半天还是这个版本好用!于是又折腾了回去。温馨提示,这个是二合一...

    .net面试题(最新)

    1.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m 答: int sum=0; bool flag=true; for(int i=1;i;i++) { if(flag) sum+=i; else sum-=i; flag=!flag; } return sum; 2.根据线程安全的...

    tini:一个很小但有效的容器初始化

    Tini是您可能想到的最简单的init 。 Tini所做的全部工作就是产生一个孩子(Tini本应在容器中运行),并等待它退出所有时间,同时收获僵尸并执行信号转发。 为什么选择蒂尼? 使用Tini有几个好处: 它可以保护您...

    php的json和数组相互转换,以及ci框架的一些笔记

    php的json和数组相互转换,ci框架遇到的一些问题总结,以及图片上传的一些功能

    unity iPhone 表情捕捉

    当Apple宣布iPhone X和Animoji时,我们首先想到的是:我们可以用它来制作任意3D角色的动画吗?也就是说,不仅仅是Apple设计的Animoji。

    模仿iphone微格客户端swipe操作方式的代码实现

    而让我眼前一亮的是微格,它的操作方式可以看成是navigation+swipe,上手感觉很顺畅,手指的操作也很自然,这让我想起了前段时间诺基亚发布的N9,N9强调的一种用户体验就是swipe,一种最自然的手势。 自己也在iphone...

    仿iphone微格客户端swipe操作方式的代码实现

    而让我眼前一亮的是微格,它的操作方式可以看成是navigation+swipe,上手感觉很顺畅,手指的操作也很自然,这让我想起了前段时间诺基亚发布的N9,N9强调的一种用户体验就是swipe,一种最自然的手势。 自己也在...

    仿ipod图片展示(含源码)

    仿ipod图片展示(含源码) 最近要做一个类似苹果ipod的图片展示效果,于是在网上搜,可一直搜不到源码。悲剧,后来决定自己试试,没想到还误打误撞给弄出来了,效果感觉还可以,希望对大家有用,欢迎留言提意见,谢谢

    算法设计与实验题解一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或006。数字统计问题要求对给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9。

    这个题目有个最容易想到的n*log10(n)的算法。这是自己写的复杂度为O(n*log10(n))的代码: void statNumber(int n) { int i, t; int count[10] = {0}; for(i = 1; i ; i++) { t = i; while(t) { count...

    Java I/O总结

     从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的  Java I/O总结——InputStream  Java I/O总结——OutputStream  Java I/O总结——Reader  Java I/O总结——Writer  Java I...

    动态规划 ppt演示

    解最长公共子序列问题时最容易想到的算法是穷举搜索法,即对X的每一个子序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列,并且在检查过程中选出最长的公共子序列。X的所有子序列都检查过后即可求...

    数据结构严蔚敏版(C语言版)参考答案

    第一章 绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数 { scanf("%d,%d,%d",&x,&y,&z);...如果采用递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达O(k^m).

    数据结构答案 严蔚敏版

    第一章 绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数 { scanf("%d,%d,%d",&x,&y,&z);...如果采用递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达O(k^m).

    严蔚敏的算法设计答案汇总

    严蔚敏的算法设计答案 第一章 绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数 { scanf("%d,%d,%d",&x,&y,&z);...(大多数人都会首先想到递归方法),则时间复杂度将高达O(k^m).

    从B_树、B+_树、B_树谈到R_树.doc

    第一节、B树、B+树、B*树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找...根据平衡二叉树的启发,自然就想到平衡多路查找树结构,也就是这篇文章所要阐述的第一个主题B~tree(B树结构)。

    计算机课程实习报告.doc

    i++) { printf("%d.%d.%d.%d\t%6d.%d.%d.%d\t%6c\n",r.amid[i][0],r.amid[i][1 ],r.amid[i][2],r.amid[i][3],r.subnet[i][0],r.subnet[i][1],r .subnet[i][2],r.subnet[i][3]...

    判断2个字符串是否含有相同的字符

    还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]数组记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找数组中最大值,此时目标子字符串的起点下标(i)和 i ...

    html5 小游戏 demo

    11.用Ant和compiler合并压缩js后发布到sae 如果你发现有什么不合理的,需要改进的地方,请留言。或者可以通过 328452421@qq.com 联系我,非常感谢。 http://blog.csdn.net/xiaoxiao108/article/details/8913616

    2025NOIP普及组.rar

    左两点的路径数目之和,因此我们可以使用逐列(或逐行)递推的方法来求出从起始顶点到重点的路径数目,即使有障碍(我们将马的控制点称为障碍),这一方法也完全适用,只要将到达该点的路径数目置为0即可,用F[i,j]...

Global site tag (gtag.js) - Google Analytics