`

i++, ++i 原理

 
阅读更多
 最近网上看到一个面试题目是关于i++和++i,对于i++ 和++i 很多人都知道是不一样的,i=i++ 和 i=++i, 未必有人知道其中的奥妙,看了很多文章关于i++和++i的区别,都没有指出其中不一样的根本原因。有人说i++是线程安全的,有人说不是的,如果不是的那原因是什么呢?
我们先看下面一个例子
public class Test {
	
	public static void main(String[] args) {
		int i=0;
		i=i++;
		
		int j=0;
		j=++j;
	}
}
 
javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码, 通过查看字节码, 我们可以知道java代码在JVM中的运行过程
-l               输出行和变量的表

-public          只输出public方法和域

-protected       只输出public和protected类和成员

-package         只输出包,public和protected类和成员,这是默认的

-private         输出所有类和成员

-s               输出内部类型签名

-c               输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,

-verbose         输出栈大小,方法参数的个数  
 
java编译器输出的指令流,基本上是基于栈的指令集架构,指令流里面的指令大部分都是零地址指令,他们依赖操作数栈进行工作。
运行 javap -verbose Test,
public static void main(java.lang.String[]);
Code:
 Stack=1, Locals=3, Args_size=1
 0:   iconst_0  //首先,执行偏移地址为0的地址,把0入栈(栈顶=0),
 1:   istore_1   //把栈顶的值放到局部变量1中,即i中(i=0,栈顶=0)
 2:   iload_1  //把局部变量1的值,即0入栈,也就是说此时栈顶的值是0(i=0,栈顶=0)
 3:   iinc    1, 1 //把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,i此时变成1了(i=1,栈顶=0)
 6:   istore_1  //把栈顶的值放到局部变量1中,即i中,栈顶的值是0,此时(i=0,栈顶=0)
 7:   iconst_0  //把0入栈(栈顶=0)
 8:   istore_2  //把栈顶的值放到局部变量2中,即j中(j=0,栈顶=0)
 9:   iinc    2, 1 //把局部变量2,也就是j,增加1,这个指令不会导致栈的变化,j此时变成1了
 12:  iload_2  //把局部变量2的值,即1入栈,此时(j=1,栈顶=1)
 13:  istore_2  //把栈顶的值放到局部变量2中,即j中(j=1)
 14:  return
LineNumberTable:
 
分享到:
评论

相关推荐

    java中for(int i= 0; i<=10;i=i++)System.out.print(i);为什么无限输出0

    #### 自增运算符的工作原理 在Java中,`++`运算符用于将变量的值增加1。当它作为后缀(如`i++`)出现在表达式中时,首先返回变量的当前值,然后将变量的值增加1。这种行为可以理解为下面两个步骤: 1. **获取当前...

    C# i++and++i

    在C#编程语言中,`i++` 和 `++i` 是两种常见的增量运算符,它们都用于...理解它们的工作原理和差异,可以帮助程序员写出更准确、更易于理解的代码。在控制台应用程序中通过实例演示这些概念,是一个直观学习的好方法。

    ++i,i++,--i,i--终结

    了解这些运算符的工作原理对于编写高效、清晰的代码至关重要。 - **++i (前缀自增)**:首先将`i`的值增加1,然后返回增加后的值。 - **i++ (后缀自增)**:首先返回`i`的原始值,然后将`i`的值增加1。 - **--i (前缀...

    INTEL Pcie转千兆网 I210IT+H5020NL+RJ45 AD设计硬件原理图库+PCB封装库文件.zip

    INTEL Pcie 转千兆网 I210IT+H5020NL+RJ45 AD设计硬件原理图库+PCB封装库文件,PcbLib+SchLib格式,Altium Designer原理图库+PCB封装库文件,已在项目中验证使用,可作为你产品设计的参考也可以直接应用到你的项目...

    基于51单片机16x16点阵广告牌设计(含仿真+源码+论文+原理图)

    基于51单片机16x16点阵广告牌设计(含仿真+源码+论文+原理图) 基于51单片机16x16点阵广告牌设计(含仿真+源码+论文+原理图) 基于51单片机16x16点阵广告牌设计(含仿真+源码+论文+原理图) 基于51单片机16x16点阵广告牌...

    Spy++原理初探

    本文将深入探讨Spy++的工作原理,并通过VC++源码来解析其内部机制。 首先,让我们理解Spy++的基本功能。Spy++能够显示Windows系统中的所有窗口,包括隐藏的窗口,并提供详细的窗口属性信息,如类名、句柄、父窗口...

    树莓派3B+原理图

    4. **GPIO**:树莓派3B+有40个GPIO引脚,支持多种输入输出功能,是扩展硬件和进行I/O操作的关键。 5. **无线通信**:包括Wi-Fi和蓝牙模块,允许树莓派无线接入网络和与其他设备通信。 6. **连接器**:如USB、...

    8层板设计飞思卡尔I.MX6x+MAX8903C+WM8962智能家居控制主板CADENCE原理图+PCB.zip

    标题中的“8层板设计飞思卡尔I.MX6x+MAX8903C+WM8962智能家居控制主板CADENCE原理图+PCB”揭示了这个项目的核心技术内容,涉及到了嵌入式系统设计、电源管理以及音频处理等关键领域。以下是基于这些关键词的详细知识...

    基于STC15W404AS单片机设计的爱情心形钻戒ad设计硬件原理图+PCB+软件源码.rar

    基于STC15W404AS单片机设计的爱情心形钻戒ad设计硬件原理图+PCB+软件源码,硬件采用2层板设计,圆型板,Altium设计原理图+PCB+软件源码,可供学习设计参考, void main() { uint8 i = 0; P1M1 = 0X00; P1M0 = 0...

    移进规约过程 i+i

    在编程领域,"移进规约过程"是编译原理中的一个重要概念,主要涉及解析器的设计与实现。这个过程在编译器构造中扮演着核心角色,它将源代码转换成中间形式,以便后续的代码生成阶段能理解并生成目标代码。在此,我们...

    F5部署红宝书Part+I+-+基础安装部署.doc

    F5部署红宝书Part+I+-+基础安装部署L:·  安装前准备 ·  设备初始化 ·  ⺴⽹网络层配置 ·  N+M原理 ·  Active/Standby配置 ·  Active/Active/Standby配置 ·  安全配置基线 ·  VIPRION配置注意...

    基于C51单片机+PCF8591(AD0和AD1) 2路AD数码管显示 I2C接口软件例程源码+开发板原理图

    基于C51单片机+PCF8591(AD0和AD1) 2路AD数码管显示 I2C接口软件例程源码+开发板原理图: 名称:IIC协议 PCF8591 AD/DA转换 内容:使用4路AD中的4路检测外部模拟量输入 main() { unsigned char num=0,i; Init_...

    89C51单片机+I2C接口PCF8591(AD0和AD1) 2路AD数码管显示软件源码+ 开发板原理图.zip

    89C51单片机+I2C接口PCF8591(AD0和AD1) 2路AD数码管显示软件源码+ 开发板原理图 while (1) //主循环 { if(ReadADFlag) { ReadADFlag=0; //连续读5次,输入通道后多读几次,取最后一次值,以便读出稳定值 for(i...

    Java实现杨辉三角

    Java实现杨辉三角是一种利用编程语言来展示数学理论的方式,杨辉三角,又称帕斯卡三角,是一个在数学中广泛使用的二维数组结构。...通过这样的练习,不仅可以掌握基本的数组操作,还能深入理解数学原理在编程中的应用。

    STM32F103C8T6+ACS758电流传感器设计4位8段数码显示电流表ALTIUM硬件原理图+PCB+软件源码.zip

    STM32F103C8T6+ACS758电流传感器设计4为8段数码显示电流表ALTIUM硬件原理图+PCB+软件源码,2层板设计,大小为100x50mm,单面面布局双面布线,Altium Designer 设计的工程文件,包括完整的原理图及PCB文件,可以用...

    编译原理作业要求

    ### 编译原理作业要求详解 #### 一、实验背景及目标 本次实验的主要目的是让学生通过实际操作,深入了解和掌握LL(1)语法分析的基本原理和技术。通过设计、实现并调试一个具体的语法分析程序,学生将能够更好地理解...

    i2c扩展板+电源板+传感器板的原理图+PCB+其它设计资料.zip

    i2c扩展板+电源板+传感器板的原理图+PCB+其它设计资料.zip

    编译作业2.3.jpg

    3(20分)令文法为 E→T∣E+T∣E-T T→F∣T*F∣T/F F→(E)∣i (1)给出i+i*i、i*(i+i)的最左推导和最右推导 (2)给出i+i+i、i+i*i的语法树

    全志A40i核心板开发资料,含芯片手册和电路图

    未列全,有核心板电路原理,各芯片手册 ├─ic │ Allwinner_A40i_Datasheet_V1.1.pdf │ Allwinner_A40i_User_Manual_V1.1.pdf │ ├─开发板规格书 │ UW-M135-V1.1 技术规格书.pdf │ └─硬件 │ Allwinner ...

    STM32F103C8T6+DM9051实现SPI转以太网功能板AD原理图+lwip-DM9051软件源码.zip

    STM32F103C8T6+DM9051实现SPI转以太网功能板AD原理图+lwip_DM9051软件源码 void mem_shw(char *hdstr, uint8_t *payload, u16_t len) { u16_t i; if ((unsigned int)hdstr){ DM9051_TRACE(mem_str[(int)...

Global site tag (gtag.js) - Google Analytics