最近网上看到一个面试题目是关于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中,`++`运算符用于将变量的值增加1。当它作为后缀(如`i++`)出现在表达式中时,首先返回变量的当前值,然后将变量的值增加1。这种行为可以理解为下面两个步骤: 1. **获取当前...
在C#编程语言中,`i++` 和 `++i` 是两种常见的增量运算符,它们都用于...理解它们的工作原理和差异,可以帮助程序员写出更准确、更易于理解的代码。在控制台应用程序中通过实例演示这些概念,是一个直观学习的好方法。
了解这些运算符的工作原理对于编写高效、清晰的代码至关重要。 - **++i (前缀自增)**:首先将`i`的值增加1,然后返回增加后的值。 - **i++ (后缀自增)**:首先返回`i`的原始值,然后将`i`的值增加1。 - **--i (前缀...
本文将深入探讨Spy++的工作原理,并通过VC++源码来解析其内部机制。 首先,让我们理解Spy++的基本功能。Spy++能够显示Windows系统中的所有窗口,包括隐藏的窗口,并提供详细的窗口属性信息,如类名、句柄、父窗口...
INTEL Pcie 转千兆网 I210IT+H5020NL+RJ45 AD设计硬件原理图库+PCB封装库文件,PcbLib+SchLib格式,Altium Designer原理图库+PCB封装库文件,已在项目中验证使用,可作为你产品设计的参考也可以直接应用到你的项目...
基于51单片机16x16点阵广告牌设计(含仿真+源码+论文+原理图) 基于51单片机16x16点阵广告牌设计(含仿真+源码+论文+原理图) 基于51单片机16x16点阵广告牌设计(含仿真+源码+论文+原理图) 基于51单片机16x16点阵广告牌...
4. **GPIO**:树莓派3B+有40个GPIO引脚,支持多种输入输出功能,是扩展硬件和进行I/O操作的关键。 5. **无线通信**:包括Wi-Fi和蓝牙模块,允许树莓派无线接入网络和与其他设备通信。 6. **连接器**:如USB、...
标题中的“8层板设计飞思卡尔I.MX6x+MAX8903C+WM8962智能家居控制主板CADENCE原理图+PCB”揭示了这个项目的核心技术内容,涉及到了嵌入式系统设计、电源管理以及音频处理等关键领域。以下是基于这些关键词的详细知识...
基于STC15W404AS单片机设计的爱情心形钻戒ad设计硬件原理图+PCB+软件源码,硬件采用2层板设计,圆型板,Altium设计原理图+PCB+软件源码,可供学习设计参考, void main() { uint8 i = 0; P1M1 = 0X00; P1M0 = 0...
在编程领域,"移进规约过程"是编译原理中的一个重要概念,主要涉及解析器的设计与实现。这个过程在编译器构造中扮演着核心角色,它将源代码转换成中间形式,以便后续的代码生成阶段能理解并生成目标代码。在此,我们...
F5部署红宝书Part+I+-+基础安装部署L:· 安装前准备 · 设备初始化 · ⺴⽹网络层配置 · N+M原理 · Active/Standby配置 · Active/Active/Standby配置 · 安全配置基线 · VIPRION配置注意...
基于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数码管显示软件源码+ 开发板原理图 while (1) //主循环 { if(ReadADFlag) { ReadADFlag=0; //连续读5次,输入通道后多读几次,取最后一次值,以便读出稳定值 for(i...
Java实现杨辉三角是一种利用编程语言来展示数学理论的方式,杨辉三角,又称帕斯卡三角,是一个在数学中广泛使用的二维数组结构。...通过这样的练习,不仅可以掌握基本的数组操作,还能深入理解数学原理在编程中的应用。
STM32F103C8T6+ACS758电流传感器设计4为8段数码显示电流表ALTIUM硬件原理图+PCB+软件源码,2层板设计,大小为100x50mm,单面面布局双面布线,Altium Designer 设计的工程文件,包括完整的原理图及PCB文件,可以用...
### 编译原理作业要求详解 #### 一、实验背景及目标 本次实验的主要目的是让学生通过实际操作,深入了解和掌握LL(1)语法分析的基本原理和技术。通过设计、实现并调试一个具体的语法分析程序,学生将能够更好地理解...
i2c扩展板+电源板+传感器板的原理图+PCB+其它设计资料.zip
未列全,有核心板电路原理,各芯片手册 ├─ic │ Allwinner_A40i_Datasheet_V1.1.pdf │ Allwinner_A40i_User_Manual_V1.1.pdf │ ├─开发板规格书 │ UW-M135-V1.1 技术规格书.pdf │ └─硬件 │ Allwinner ...
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的语法树
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)...