java学习(12):i++和++i的区别

先上代码:
public static void main(String args[]) {
int A = 1;
int B = 10;
int C = 100;
int D = 1000;

    System.out.println(A++);System.out.println(++B);System.out.println(C++ + C++);System.out.println(C);System.out.println(D++ + ++D);System.out.println(D);
}

在来运行结果:
1
11
201
102
2002
1002

Process finished with exit code 0
Reason:
前两个可能大家都比较容易理解,我们这里只简单的介绍后两个原因:
(1)C++ + C++:
36: iload_3
37: iinc 3, 1
40: iload_3
41: iinc 3, 1
44: iadd
45: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
48: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
51: iload_3
52: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
55: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
上面是(1)相关操作的JVM字节码:
36-iload_3操作:JVM首先将局部变量表中位置为3的元素(即100)压入栈顶。
37-iinc 3, 1操作:然后将局部变量表中位置为3的元素的值进行了+1的操作,注意此时栈顶元素的值并未变化,仍为100。
40-iload_3操作:JVM再次将局部变量表中位置为3的元素(即101)压入栈顶。
41-iinc 3, 1操作:然后再次将局部变量表中位置为3的元素的值进行了+1的操作,此时局部变量表中位置为3的元素的值变成102。
44-iadd操作:将栈顶的两个元素101及100相加再次压入栈顶,此时栈顶元素变成了201.
45、48操作:print栈顶元素的值,结果输出201
51-iload_3操作:将局部变量表中位置为3的元素(即102)压入栈顶。
52、55操作:print栈顶元素的值,结果输出102
(2)D++ + ++D:
58: iload 4
60: iinc 4, 1
63: iinc 4, 1
66: iload 4
68: iadd
69: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
72: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
75: iload 4
77: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
上面是(2)相关操作的JVM字节码:
58-iload_4操作:JVM首先将局部变量表中位置为4的元素(即1000)压入栈顶。
60-iinc 4, 1操作:然后将局部变量表中位置为4的元素的值进行了+1的操作,注意此时栈顶元素的值并未变化,仍为1000。
63-iinc 4, 1操作:JVM再次将局部变量表中位置为4的值进行了+1的操作,此时值变成了1002。
66–iload_4操作:JVM再次将局部变量表中位置为4的元素压入栈顶。
68-iadd操作:将栈顶的两个元素1002及1000相加再次压入栈顶,此时栈顶元素变成了2002.
69、72操作:print栈顶元素的值,结果输出2002
75-iload_4操作:将局部变量表中位置为4的元素(即1002)压入栈顶。
52、55操作:print栈顶元素的值,结果输出1002

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于高维数组抽象性质的理解

对于数组的维数理解,应该清楚的认识到,一维数组是“线性的”的,二维数组是“平面”的,而三维数组时“立体”的,其不仅反映了其在计算机中物理储存层面上的描述,同时也表现了其抽象模型的性质,而…

java学习(13):scanner中的方法

//Scanner类中的方法 //优点一: 可以获取键盘输入的字符串 //优点二: 有现成的获取int,float等类型数据,非常强大,也非常方便; public static void ScannerTest(){ Scanner sc new Scanner(System.in); System.out.println(“ScannerTest, P…

php mysql注册登录界面_php实现登录注册界面

php实现登录注册界面首先你要搭建一个自己的数据库我用wamp64创了一个people的数据库具体操作可以参考该搭建链接:这里就讲下我实现的功能代码:创建sql.func.php实现一些基本函数功能/***弹框*/function_alert($_info){echo"";exit;}/*** _loc…

Python全栈开发——面向对象的三大特性(继承 多态 封装)

1.继承 1.两层意思 改变和扩展(详细看随笔继承和组合) 2.多态(体现在运行时的状态) 1.不同的类可以调用相同的方法,得到不同的结果 2.实际上是继承的一种体现机制 class H2o:def __init__(self,name,temperature):se…

exp/imp和expdp/impdp在功能上的区别:

exp/imp和expdp/impdp在功能上的区别:   1、把用户usera的对象导入到userb   emp/imp用法:   formuserusera touseruserb;   empdp/impdp用法:   remap_schema‘usera’:‘userb’   例如:   imp system/password f…

Java_枚举

枚举 JDK1.5引入枚举类型, 枚举类型的定义包括枚举的声明和枚举体 enum Season {SPRING, SUMMER, AUTUMN, WINDER } 所有的枚举类型隐性的继承来自java.langEnum, 枚举实质上还是类, 而每个被枚举的成员实质就是一个枚举类型的实例, 它们默认都以public static final修饰, 可以…

oracle数据库实例,数据库的理解

数据库就是一个相片底片 实例就是相纸 一个底片可以冲多个相纸,但一张相纸最多冲一个底片。 tom的一个解释 数据库(database):物理操作系统文件或磁盘( disk)的集合。使用Oracle 10g 的自动存储管理&#…

keepalive日志_12.日志收集项目-数据流图以及nginx安装

数据流图nginx安装中文文档http://tengine.taobao.org/nginx_docs/cn/docs/基础依赖与安装yum -y install gcc gcc-c autoconf pcre pcre-devel make automakeyum -y install wget vim httpd-toolsyum源在官网拷贝vi /etc/yum.repos.d/nginx.repo[nginx-stable]namenginx stabl…

【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例

01 什么是禁忌搜索算法? 1.1 先从爬山算法说起 爬山算法从当前的节点开始,和周围的邻居节点的值进行比较。 如果当前节点是最大的,那么返回当前节点,作为最大值 (既山峰最高点);反之就用最高的邻居节点来,替…

java学习(14):java命名规范

//任务 4 在控制台打印输出java标识符定义规则。具体包括: //1)类名定义规则 //2)方法名定义规则 //3)变量定义规则 //4)常量定义规则 一、命名规范 1、 项目名全部小写 2、 包名全部小写 3、 类名首字母大写&…

jdbc获取clob图片_jdbc方式读取oracle的clob字段实例

可能大家也都习惯了spring和hibernate对CLOB字段的处理,在spring中配置clob的oracle处理句柄,在hibernate中配置映射类型,然后就可以很轻松的以String 的形式处理大字段。今天我做了个需求,需要以jdbc的方式从mysql导一些备份数据…

14. Java基础之泛型

一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest {2 3 public static void main(String[] args) {4 List list new ArrayList();5 list.add("qqyum…

java学习(15):巩固练习

//任务 1 //编写控制台java程序,使用Scanner 对象相关方法从 //控制台接收用户输入如下数据并使用相关的局部变量接收,在控制台打印输出。 //老师的姓名;老师的性别;老师的工资;老师的年龄;工作时长 import…

java学习(16):巩固练习

/任务 2 编写控制台java程序,将以下数据使用合理类型变量进行接收赋值 3.5;185.59;8500.50 要求在控制台打印这些数据并只显示整数部分。/ import java.util.Scanner; public class test02{ public static void main(String[] args){ Scanner…

mac电脑投屏到小米盒子_苹果手机搜不到小米盒子怎么办?

刚买的小米电视盒子迫不及待想投屏,但是手机是苹果系统,都是连得同一wifi,可是手机就是搜索不到小米家的客厅电视,这种情况该怎么办呢?以下小编给大家详细介绍了苹果手机搜不到小米盒子该怎么办。苹果设备中搜不到小米…

Redis实现之对象(三)

集合对象 集合对象的编码可以是intset或者hashtable,intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。举个栗子,以下代码将创建一个图1-12所示的intset编码集合对象: 127.0.0.1:637…

java学习(17):巩固练习

//#任务 3 //#已知有三个人,张无忌,任盈盈,任我行。当前只知道任盈盈的年龄 //#可以被用户从控制台输入,并且用户可以告知任盈盈的年龄比张无忌的年龄小几岁, //#任我行年龄是张无忌和任盈盈年龄和还要大几岁&#xff…

mysql innodb redolog_MySQL · 引擎特性 · InnoDB redo log漫游(转)

前言InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性。和大多数关系型数据库一样,InnoDB记录了对数据文件的物理更改&#xff0c…

Jenkins配置:添加用户和管理权限

Jenkins配置:添加用户和管理权限 参考文章:http://www.cnblogs.com/zz0412/p/jenkins_jj_14.html 今天给大家说说使用Jenkins专有用户数据库的配置,和一些常用的权限配置。 配置用户注册 在新安装好的jenkins中,默认是没有设置用户…

java学习(18):巩固练习

/任务 4 白大壮和白二壮是双胞胎兄弟, 白大壮的身高增加1厘米正好是白二壮的身高 ,白二壮体重正好是妹妹白无瑕体重,编写程序完成白大壮 和白二壮身高的计算并输出,并计算白无瑕的体重输出是多少/ import java.util.Scanner; publ…