java ++i、i++、i++ + ++i、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
1002Process finished with exit code 0

Reason:

前两个可能大家都比较容易理解,我们这里只简单的介绍后两个原因:

(1)C++ + C++:

      36: iload_337: iinc          3, 140: iload_341: iinc          3, 144: iadd45: invokevirtual #3 // Method java/io/PrintStream.println:(I)V48: getstatic     #2 // Field java/lang/System.out:Ljava/io/PrintStream;51: iload_352: invokevirtual #3 // Method java/io/PrintStream.println:(I)V55: 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         460: iinc          4, 163: iinc          4, 166: iload         468: iadd69: invokevirtual #3 // Method java/io/PrintStream.println:(I)V72: getstatic     #2 // Field java/lang/System.out:Ljava/io/PrintStream;75: iload         477: 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/451070.shtml

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

相关文章

一个判断session是否过期的小技巧

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下! 1.session其实就是一个Ma…

扩展方法

扩展方法是写在静态类中,且方法是静态方法。 不限制参数的数量。 不限制返回类型。 不限制可使用扩展方法的类型。 和普通方法编写相似,唯一不同的是每一个扩展方法都必须有一个固定的参数。statc void Method( this DataType name&#xff0…

cpu执行命令方式

(一)有序处理器 早期的处理器为有序处理器(In-order processors),有序处理器处理指令通常有以下几步: 指令获取如果指令的输入操作对象(input operands)可用(例如已经在寄存器中了&#xff09…

jQuery基础-事件

只能添加一个处理函数,后面的会覆盖前面 会有兼容性差异 冒泡 会依次检查父元素 截获冒泡 或者 最大的缺陷 并且在IE和NetSpace里面分别为冒泡和捕获两种 多个处理函数 依次执行 捕获--->自己--->冒泡 true 只捕获,不冒泡 false 只冒泡 从父元素的…

别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文

AI打游戏已经不是什么新鲜事了,“沉迷”Dota 2、星际争霸、LOL的AI一个接一个的出现。 但是你也许不知道,相比这些“游戏玩家”AI,还有一位优秀的AI,直接当起了“游戏策划”,做的还是脍炙人口的“超级马里奥”。 &…

单点登录的三种实现方式

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,…

快速判断数组中每个对象同一属性值是否相同

做批量查询的时候,要确定数组中的多个对象下的字符串是否能全部匹配,这时需要在匹配的名称对象中通过字段记录该名称是否匹配。 const search [ { name: B, isExistence: false },{ name: C, isExistence: false } ]; 这时要确定 search 是否全部匹配上…

java对象占用内存大小?

一个不包含任何内部成员变量的空Object大约占33byte,若增加成员变量,则增加相应大小的内存占用。 测算方式:设置jvm的堆大小为1m,在堆中不停new不含任何成员变量的OOMObject对象,直到堆内存溢出。如下图,在…

Java程序员面试中的多线程问题

很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。 0.Java 中多线程同步是什…

SpringBoot2使用WebFlux函数式编程

本文只是简单使用SpringBoot2使用WebFlux的函数式编程简单使用,后续会继续写关于Webflux相关的文章。 最近一直在研究WebFlux,后续会陆续出一些相关的文章。 首先看一下Srping官网上的一张图,对比一下SpringMvc和Spring WebFlux,如…

单点登录原理与简单实现

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏…

java接口类支持多继承

一个类只能extends一个父类,只能有一个父类,但可以implements多个接口。java通过使用接口的概念来取代C中多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。Java中的接口是支持多继承的。

xmind-HTTP协议

转载于:https://www.cnblogs.com/margot921/p/9764788.html

弹性布局

弹性布局 一、Flex布局是什么? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。 二、基本概念 采用Flex布局的元素,称为Flex容器(flex container&…

Java-Type简单分类

&#xff08;1&#xff09;ParameterizedType&#xff1a; 参数化类型&#xff0c;例如List<T>。 &#xff08;2&#xff09;GenericArrayType&#xff1a; 泛型数组类型&#xff0c;例如T[]。 &#xff08;3&#xff09;TypeVariable&#xff1a; 泛型的类型变量&a…

解决dataTable 报错:cannot read property “style“ of undefined

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 其实这错&#xff0c;我之前也遇到过&#xff0c;只是太久了&#xff0c;没有记录下来&#xff0c; 今天看到群里朋友也遇到这个错误&a…

万恶之源 - Python基础数据类型一

整数 整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较 在32位机器上int的范围是: -2**31&#xff5e;2**31-1&#xff0c;即-2147483648&#xff5e;2147483647 在64位机器上int的范围是: -2**63&#xff5e;2**63-1&#xff0c;即-9223372036854775808&…

谈谈对于技术面试的心得体验

导读&#xff1a;作者lzprgmr写了一篇《谈谈技术面试》文章&#xff0c;他在文中讲述了自己对于技术人员面试的经验和心得&#xff0c;以下是文章内容&#xff1a; 只要是招一个技术人员&#xff0c;不管是初级的程序员还是高级软件工程师&#xff0c;技术上的考核都必不可少。…

es6中class类的全方面理解(三)------静态方法

不需要实例化类&#xff0c;即可直接通过该类来调用的方法&#xff0c;即称之为“静态方法”。将类中的方法设为静态方法也很简单&#xff0c;在方法前加上static关键字即可。这样该方法就不会被实例继承&#xff01; class Box{static a(){return "我是Box类中的&#xf…

jackson/fastJson boolean类型问题

1.我们以Person对象举个栗子&#xff0c;person有三个属性。name&#xff0c;age和isGay Data public class Person {public Person(String name, int age, boolean isGay) {this.name name;this.age age;this.isGay isGay;}private String name;private Integer age;priva…