从字节码来分析,i++与++i区别
++/-- 是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数
前缀自增(++a):先进行自增运算,再进行表达式运算;
后缀自增(a++):先进行表达式运算,再进行自增运算。
int x = 5, y=5;
int a = 2*++x;
int b = 2*y++;
System.out.println(a+"=="+b);
输出结果:a = 12, b =10;
前缀++,先自增运算,=》 a=2*6
后缀++,先表达式运算,=》b=10;
public void prefixAdd(){
int i = 100;
i = ++i;
System.out.println(i);
} public void postfixAdd(){
int i = 100;
i = i++;
System.out.println(i);
} public void varAdd(){
int i = 100;
int y = i++;
System.out.println(i+"=="+y);
}
这里比较让人困扰的是第二与第三个方法的区别。这需要从编译的字节码到底层数据分布来查看。
iload_1 :从栈帧的局部变量读取,1表示索引
istore_1:存储到局部变量,1表示索引
iinc:局部变量增加一个常量值
前缀++与后缀++的区别:
当进行到第7行时,istore_1存储的值还是100, 并且覆盖掉已经增加到101的局部变量1。 因此当11行,再次iload_1还是100。
前缀++ 第3行进行了局部变量增加,第6行读取时已经是101,第7行再次存储到局部变量1也是101,因此第11读取时也是101。
后缀++: 先读取局部变量,再进行局部变量增加
前缀++:先局部变量增加,再读取。
第三个方法,使用一个变量把第一次iload_1的值(i=100)存储到istore_2中局部变量中,所以局部变量1的值是101,并没有被覆盖。
因此输出结果:
101
100
101==100
i = i++; ---> int y = i++;这样转变下,就能更好地理解,i = i++; 为什么i=100。
从字节码来分析,i++与++i区别的更多相关文章
- 从字节码角度分析Byte类型变量b++和++b
1. 下面是一到Java笔试题: public class Test2 { public void add(Byte b) { b = b++; } public void test() { Byte ...
- synchronized关键字所生成的字节码详细分析
在之前已经将如下这样的源文件对应的字节码文件完整的分析完了,如下: 这次再来写一个内容稍丰富一点的类,准备再来从头至尾的来分析一下,对其字节码的理解进一步巩固,如下: 然后用javap -verbos ...
- 反编译字节码角度分析synchronized关键字的原理
1.synchronized介绍 synchronized是java关键字.JVM规范中,synchronized关键字用于在线程并发执行时,保证同一时刻,只有一个线程可以执行某个代码块或方法:同时还 ...
- 【synchronized锁】通过synchronized锁 反编译查看字节码指令分析synchronized关键字修饰方法与代码块的区别
前提: 首先要铺垫几个前置的知识: Java中的锁如sychronize锁是对象锁,Java对象头中具有标识位,当对象锁升级为重量级锁时,重量级锁的标识位会指向监视器monitor, 而每个Java对 ...
- 【腾讯内部干货分享】分析Dalvik字节码进行减包优化
http://wetest.qq.com/lab/view/?id=96?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.192184.TAS ...
- 通过字节码分析Java方法的静态分派与动态分派机制
在上一次[https://www.cnblogs.com/webor2006/p/9723289.html]中已经对Java方法的静态分派在字节码中的表现了,也就是方法重载其实是一种静态分派的体现,这 ...
- 通过字节码分析Java异常处理机制
在上一次[https://www.cnblogs.com/webor2006/p/9691523.html]初步对异常表相关的概念进行了了解,先来回顾一下: 其源代码也贴一下: 下面来看一下jclas ...
- 用Eclipse插件Bytecode Outline来查看Java字节码
在遇到一些小问题的时候我们经常会使用Javap反编译取得字节码来分析,虽然Javap能完成这个工作,但是有两个缺点,一方面操作麻烦,需要很多步骤,一方面没有文档注释,对新手来说看起字节码来比较麻烦. ...
- python反编译之字节码
如果你曾经写过或者用过 Python,你可能已经习惯了看到 Python 源代码文件:它们的名称以.Py 结尾.你可能还见过另一种类型的文件是 .pyc 结尾的,它们就是 Python "字 ...
随机推荐
- Oracle介绍
Published: 2016-11-08 22:15:00 In Data Mining. tags: SQL 版本与配置 企业版 标准版 个人版 事务性数据表 分析型数据表 PL/SQL 配置 控 ...
- sycPHPCMS v1.6 cookie sqlinjection
./user/index.php include "../include/conn.php"; include "../include/function.php" ...
- ZeroMQ,史上最快的消息队列
一.ZMQ 是什么 阅读了 ZMQ 的 Guide 文档后,我的理解是,这是个类似于 Socket 的一系列接口,他跟 Socket 的区别是:普通的 socket 是端到端的(1:1的关系),而 Z ...
- Haproxy 使用block 阻止域名访问到某个子目录报403
配置教程如下: acl is_https_com hdr_beg(host) www.baidu.com #定义规则域名 acl api_block_url_web url_dir -i /web/ ...
- Python 将两个绝对路径拼接
import os def two_abs_join(abs1, abs2): """ 将 绝对路径将两个绝对路径拼接, 就是将第二个的开路径(windows 的 C, ...
-  前端面试题目总结1
数据类型 js中的数据类型有两类:值类型和引用类型 值类型:number.string.boolean.Symbol.undefined 引用类型:null.数组.对象 使用typeof能用来干什么 ...
- MVC07
1. 讲解ASP.net MVC的I/O操作 新建一个控制台程序,输入代码如下 using System; using System.IO; namespace IO { class Program ...
- [C++入门篇]了解C++
前言 我是杨某人,点击右下方"+"一键关注我.如果你喜欢我的文章,那么拒绝白嫖行为.然后..请多来做客鸭. 如果你是已经入门的大佬,请滑到下方点个推荐再走. 我个人认为,博客有两种 ...
- 什么是RPM
RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.S.u ...
- 内网渗透之跨边界传输 - LCX转发
跨边界转发 端口转发 lcx 流程 目标机 ./lcx -slave 跳板机ip 监听的端口 127.0.0.1 要转发的端口 跳板机(公网) ./lcx -listen 监听的端口 转发给攻击机访问 ...