`
jveqi
  • 浏览: 321719 次
  • 性别: 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

分享到:
评论

相关推荐

    山东省临沭县青云镇中学九年级英语全册《Unit 6 I like music that I can dance to》复习学案(

    本文主要涉及的是九年级英语全册《Unit 6 I like music that I can dance to》的复习内容,涵盖了话题词汇、功能句型、定语从句、重点单词和短语以及重要句子。 一、话题与词汇(Mind Map) 1. 话题:音乐与个人...

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

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

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

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

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

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

    石子合并问题 用动态规划方法

    当`j - i == 1`时,`f[i][j] = a[i] + a[j]`,其中`a[i]`和`a[j]`分别表示第`i`个和第`j`个石子的分数。 4. **最终结果**:最后,我们需要遍历所有的`f[i][n]`(其中`n`是石子总数),找到其中的最大值作为最终答案...

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

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

    2025NOIP普及组.rar

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

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

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

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

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

    仿ipod图片展示(含源码)

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

    i-like-music-that-i-can-dance-to教学设计说明.doc

    - 学习和谈论音乐,包括词汇如lyric(歌词)、gentle(柔和的)、remind of(使想起)、exhibition(展览)、prefer(更喜欢)、photographer(摄影师)、energy(能量)等。 2. **教学流程(Procedures)** - **...

    一般过去时用法说明.doc

    需要注意的是,used to 和 would 也可以用来描述过去习惯性的动作。 2. 一般过去时表现在 在某些特殊情况下,一般过去时可以用来描述现在的状态或动作,例如: * 在宾语从句中,由于时态呼应的关系,可以用一般...

    黑龙江省绥化市第九中学九年级英语全册《Unit 6 I like music that I can dance to Secti

    它的用法包括`dislike doing sth.` 和 `dislike sth.`,例如:`I dislike playing football.`(我不喜欢踢足球。) - **recently**:这是一个副词,表示最近,用于谈论过去发生的事情,通常与现在完成时态搭配,...

    Java I/O总结

    Java I/O系统主要由以下四类流组成: - **InputStream**: 用于读取原始字节流。 - **OutputStream**: 用于写入原始字节流。 - **Reader**: 用于读取字符流。 - **Writer**: 用于写入字符流。 每种流都有其特定的...

    最大覆盖问题算法设计.docx

    当然很容易就可以想到,从后到前进行此操作是最理想的。经过上述的操作之后,我们就能很容易的把问题转化为“找相同连续数字的最大长度”了。这也是非常简单的,只需一次扫描数组就能计算结束了。 代码实现: ```c...

    湖北省南漳县肖堰镇肖堰初级中学九年级英语全册《Unit 6 I like music that I can dance to(第

    这篇资料是针对湖北省南漳县肖堰镇肖堰初级中学九年级学生的英语课程,主题为“Unit 6 I like music that I can dance to”的第二课时。本课旨在帮助学生掌握一系列与音乐相关的词汇和表达方式,同时训练他们使用...

    数据结构严蔚敏版(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).

    山东省青岛市城阳区第七中学九年级英语全册 Unit 6 I like music that I can dance to练习2(

    - 使某人想起或意识到……:remind sb. of or make sb. aware of... - 各种不同的音乐:all kinds of music - 随着音乐起舞:dance along with the music - 伴随…歌唱:sing along with... 3. 句子翻译: - I...

Global site tag (gtag.js) - Google Analytics