【Java基础】i = i + 1,i += 1, i++, ++i 的区别

从字节码角度分析i++与++i以及i+=1与i=i+1运算操作 变量的自增操作,如 i++ ++i i+=1 i=i++ 这些自增操作的算术运算可能计算的最后结果是一样,仅从代码层面很难看出它们的异同。下面将从字节码指令的角度去分析这些操作的不同之处。 i++与++i的区别 如果只是进行变量的自增的运算,不涉及赋值操作,那么i++和++i在字节码指令层面上是执行相同的指令 可以看出i++与++i的字节码指令是一样的,都是先将操作数10压入操作数栈,然后保存到局部变量表索引为1的位置,也就是保存变量i的位置,然后将局部变量表索引为1的位置的变量的值加1。 但是如果 阅读详情

问题引入:

最开始是因为看到了一个题:

① short s1 = 1; s1 = s1 + 1;
② short s1 = 1; s1 += 1;

上面两条是否都可以成功编译?

答:① 中,由于 1 是 int 类型的,因此 s1 + 1 也是 int 类型的,需要进行强制类型转换,才能赋值给 short;
② 中,s1 += 1 就相当于 s1 = ((short)s1 + 1),+= 本身就隐含着强制类型转换,故可正确编译。

问题拓展:

上面涉及到了 += 和 s1 = s1 + 1 的区别,除了 += 本身隐含强制类型转换以外,+= 的效率也会比 s1 = s1 + 1 高一些。

突然想起了多次看过的 i++ 和 ++i 的区别的问题,当时只是大概知道 i++ 是用完了再自增,而 ++i 是自增了再用,既然想到了,就从原理上搞搞清楚。

一个 Test 看 i++ 和 ++i:

查资料的过程中看到了一个题,自己去跑了一下:

package test;

public class test {

	public static void main(String[] args) {
		int i = 1;
		i = i++;
		System.out.println("i=" + i);
		int j = i++;
		System.out.println("j=" + j + " i=" + i);
		int k = i + ++i * i++;
		System.out.println("k=" + k + " i=" + i);
	}
}

输出结果:
在这里插入图片描述

原理分析:

从《深入理解Java虚拟机(第3版)》里可以看到,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。

而这里会用到的是栈帧中的局部变量表、操作数栈。

对于 i++ 来说,一共需要 2 步:
① 把 i 放到操作数栈里;
② 对局部变量表里的 i 自增。

对于 ++i 来说,与上面相反:
① 对局部变量表里的 i 自增,此时操作数栈为空;
② 把 i 放到操作数栈里。

下面来看 test 里的每个语句对应着发生了什么,首先需要明确:

System.out.println 输出的是局部变量表里的值;
操作数栈,是一个后入先出栈。当一个方法刚刚开始执行的时候,该方法的操作数栈是空的,在方法执行的过程中,会有个各种字节码指令望操作数栈中写入和提取内容,也就是出栈和入栈操作。赋值操作是将操作数栈中的操作数经过运算后赋值给局部变量表中的变量的。

int i = 1; 此时局部变量表中为 i = 1 ,操作数栈为空。

i = i++; 注意不是 i++,是先 i++ 然后有个赋值操作:
① i 进操作数栈,此时局部变量表 i = 1 ,操作数栈 i = 1;
② 局部变量表中自增,此时局部变量表 i = 2,操作数栈 i = 1;
③ 赋值操作是将操作数栈中的数赋值给 i ,此时局部变量表 i = 1,操作数栈 i = 1。

int j = i++; 跟上面的操作类似,只是最终赋值给了 j :
① ②与上面的相同;
③ 将栈中的 i = 1 赋值给局部变量表中的 j,此时局部变量表 i = 2,j = i(1),操作数栈 i = 1。

int k = i + ++i * i++; 这条语句包含了四个部分,分别是 i ,i++,++i,以及最后计算完的赋值操作:

(1) int k = i + ++i * i++;
i 入栈,此时局部变量表 i = 2 ,操作数栈 i = 2;

(2) int k = i + ++i * i++;
①局部变量表中自增,此时局部变量表 i = 3 ,操作数栈 i = 2;
② i 入栈,此时局部变量表 i = 3 ,操作数栈 i = 3, i = 2;

(3) int k = i + ++i * i++;
① i 入栈,此时局部变量表 i = 3 ,操作数栈 i = 3,i = 3, i = 2;
② 局部变量表中自增 1,此时局部变量表 i = 4,操作数栈 i = 3,i = 3, i = 2;

(4) 赋值给 k
对操作数栈中的操作数进行运算,再赋值给局部变量表中的 k,即 k = 3 * 3 + 2 = 11。

参考资料:

  1. 《深入理解Java虚拟机(第3版)》
  2. 公众号文章:终于弄明白 i = i++和 i = ++i 的区别了!
DMC-E 系列总线控制卡----雷赛板卡介绍(十七) 低的速度平稳地接近目标位置,降低运动部件对接触点的冲击。设置插补目标位置,插补方向,以确定插补动作。圆形区域限位,即运动仅在用户设定的圆形范围内进行,超出这个范围,运动会依据设定。首先,用户需要绑定两个轴进而确定该功能所处的坐标系。仅支持平面圆形限位,不支持空间圆形限位。径,可以确定该区域在坐标系中的位置。)运动开始前,用户应当将旋转轴调整到与插补曲线的起点位置相切的角度;可以配合椭圆插补或圆弧插补运动,实现跟随轴的旋转运动角度与曲线当前。外,其它运动形式若开始运动时在限位区域外,则禁止运动; 阅读详情

相关推荐

基于大疆TSDK与Pix4D的热红外数据工程化处理:从RJPG到温度正射影像的完整工作流

本文详细介绍了基于大疆TSDK与Pix4D的热红外数据工程化处理完整工作流。通过Python脚本自动化解析RJPG格式的热红外图像,提取并转换其中的原始辐射数据为包含真实温度信息的TIFF文件,再结合Pix4Dmapper进行批量拼接,最终生成可直接用于GIS分析的温度正射影像图。该流程解决了手动处理效率低下、参数校准复杂等难题,实现了从原始数据到定量分析成果的高效、准确、可重复生产。

weixin_29161785的博客 377

【Java】i++、++i、i = i + 1 和 i += 1 的区别分析

目录第1部分 i++ 与 ++i 的区别第2部分 i++ (或者 ++i )与 i = i + 1 、 i += 1 的区别计算方式区别效率分析 第1部分 i++ 与 ++i 的区别 这两个的区别大部分人都知道,就简单提一下 i++ 是先进行赋值操作,后进行自增操作;而 ++i 是先进行自增操作,后进行赋值操作,举个栗子 int i = 1; int j; j = ++i; // 此时是先自...

Amadeus的博客 4388

【点云数据集】整理汇总(自用,更新ing)

涵盖了各种不同的城市场景:教堂、街道、铁路轨道、广场、村庄、足球场、城堡等等。邮件地址:dmich-request@graphics.stanford.edu,内容需包含:1. 您的姓名、头衔或职位,以及所在机构或隶属关系;license比较难获取,目前可获取的人员:(1)目前隶属于大学、工业研究实验室或其他主要机构的已发表过研究成果的研究人员;普林斯顿 ModelNet 项目的目标是为计算机视觉、计算机图形学、机器人技术和认知科学领域的研究人员提供全面、干净的物体 3D CAD 模型集合。

weixin_44392103的博客 798

Java中的i=i+1和i+=1以及i++和++i详解

一、i=i+1和i+=1 (1)概念 i=i+1使用简单赋值运算,i+=1使用复合赋值运算。 简单赋值运算和复合赋值运算的最大差别就在于:   复合赋值运算符会自动地将运算结果转型为其左操作数的类型(即将不管i是什么数据类型,都会将右边int的1转换为i的类型)。 (2)实例 //方式一: byte i=7; i+=1; //方式二: byte i=7; i=i+1; 第一种写法编译没问题,而第二种写法却编译通不过。原因就在于,当使用复合赋值运算符进行操作时,即使右边算出的结果是int类型,系统也会将其值

qq_16268979的博客 1万+

免费 AIS船舶轨迹预测 数据集 分享 (可用于长周期轨迹预测)

论文中使用的数据由提供。有关预处理步骤的详细信息,请参阅。

qq_43747519的博客 1万+

离线安装 nvidia-docker2(nvidia-container-toolkit)

很多时候大家都有用docker使用gpu的需求,但是因为网络等原因不是那么好用,这里留了一个给ubuntu的安装包,网络好的话也提供了在线安装方式。

father_yingying的博客 1181

Java中,i += 1、i = i + 1和i++有何区别?

如需转载,请标明转载来源,总结和码字都不易啊! Java中,i += 1、i = i + 1和i++有何区别? 今天在思考i += 1和i = i + 1的区别时,自己通过比较多种方式在编译期和字节码层面的差异,总结了本篇博客(纯原创!),本篇博客的所有实验都基于JDK8,不同版本的结果可能不同。当然本人水平有限(小白),可能有错误的地方,建议大家一起尝试一遍,看看大家的结果和结论是不是一样的,欢迎交流和指正,谢谢各位啦! Java中的整型类型默认为int,因此在对byte类型进行计算时,byte类型会自动

Println30的博客 4572

告别手动调参!PSCAD 4.2的Multiple-Run功能,5分钟搞定交流故障批量仿真

本文详细介绍了PSCAD 4.2的Multiple-Run功能如何高效处理交流故障批量仿真,告别传统手动调参的低效模式。通过五步配置法,工程师可在5分钟内完成数百次参数组合的仿真,显著提升电力系统分析效率。文章还包含工业级应用案例和高级调试技巧,助力实现故障仿真的自动化与智能化。

weixin_42552716的博客 278

Java初学者常见问题之 i = i + 1; 详解

Java初学者常见问题之 i = i++; 详解

Walevebot的博客 601

AI智能体协作:构建更精准的公司破产预测模型

公司破产预测对于金融机构、投资者和监管部门等具有至关重要的意义。准确的破产预测可以帮助金融机构提前做好风险防范,避免贷款损失;投资者可以根据预测结果调整投资组合,降低投资风险;监管部门可以及时发现潜在的金融风险,采取相应的监管措施。然而,传统的公司破产预测模型往往存在精度不高的问题,无法满足实际需求。本研究的目的是利用AI智能体协作的方式,构建一个更精准的公司破产预测模型。通过将多个AI智能体的优势进行整合,充分挖掘公司财务数据、市场数据等多源数据中的信息,提高预测的准确性和可靠性。

2501_92132293的博客 1082

【从0到1实战】C# WinForm开发工业级PLC监控系统(完整串口+Modbus RTU/TCP+数据库存储+源码+避坑指南)

做C#工控上位机开发的工程师,尤其是刚入行的新人,最核心的刚需就是开发一套完整的PLC监控系统。这也是工控领域最基础、最核心、应用最广的项目类型——小到单台PLC的设备测控,大到整线的产线监控,本质都是「上位机与PLC通讯,实现数据采集、参数下发、状态监控、数据存储」。碎片化的知识点学了很多,串口会用了、Modbus协议看了、数据库也懂点,但是始终无法把这些知识点串联起来,做出一套能落地的工业级PLC监控系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1561

java中i++和++i和i=i+1的原理及区别

在java(或c语言,这里以java为主)里面,i++和++i对于初学者来说,一直是一个特别容易搞混的内容,特别是那种 i=i++ 或 i=++i 这种求 i 的值。不过今天不用怕,看完这篇文章,相信你一定能搞清楚这俩个的区别!i++和++i的作用都是自增加一,但是两者的返回结果却不一样的。为什么呢?这主要得益于java的中间缓存机制。

m0_56253302的博客 1179

[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解

融合方式技术路径优点局限或注意事项UI 嵌入iframe 表单嵌入快速集成、用户体验一致无法自定义交互逻辑明道云调用 DifyAPI 请求节点工作流自动化、逻辑灵活有 timeout 限制、需优化 promptDify 调用明道云插件或 API 调用节点可查询实际业务数据、增强 AI 智能需理解明道云 API 结构、权限设置复杂明道云与 Dify 的结合为低代码平台注入了智能动力。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1187

一看就懂的i++和++i详解

一看就懂的i++和++i详解 前言 我相信很多朋友可能之前已经百度过i++和++i的相关文章了,也做过不少的练习,觉得自己已经深刻掌握了它们之间的原理了,真的是这样的吗?来试试计算一下我下面提供的几道练习,你就会发现你又不会了! 示例代码 请先自己心算一下答案,然后找个本子记下来,然后再跟我后面的答案对比,看你能做对几道题,能做对两题以上的我喊你大哥!! 示例1 int i = 0; i = i++; System.out.println("i = " + i); 123 示例2 int a = 2;

song854601134的博客 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java基础复习之赋值以short举例:i++,i+=1,i=i+1

1、这三者都是在原来的基础上进行加1操作。 2、i++ 和 i+=1操作是正确的,因为并没有改变i的数据类型。 3、但i=i+1则会报错,因为后面的加的1是int的类型,int类型不能直接转换成short类型 4、代码示例: public static void main(String[] args) { short i=1; i++; System.out.println(i); ...

weixin_39090185的博客 1798

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

return返回语句中i++、i += 1、i = i + 1的区别

如果这三个表达式是各自独立一行的,则表示的意思都是加1,但是若置于return返回语句中则大不相同 i++: /** * 测试 i++ */ public class test1 { public static void main(String[] args) { int i = 10; int x = get(i); System.out.println(x); } public static int get(int i){.

zyh201314zyh的博客 1918

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

i== i JAVA_JAVA的i++, i+=1, i=i+1有区别吗?

看一些JAVA基础题的时候,经常看到这个问题,很多人的解释是:i++最快,i+=1其次,i=i+1最慢。下面通过Sun JDK编译出来的字节码验证一下这个问题。为了让编译出来的字节码便于阅读,将这三个表达式分别写在一个方法里面:1 private voida(){2 int i=0;3 i += 1;4 }56 private voidb(){7 ...

weixin_35886636的博客 240

int i=0, i=i++ 和i++ 区别

int i=1; i=i++; System.out .print(i); 输出1 a=i++在我的理解是这样的,它先给i赋一个临时变量比如a,即a=i=1, 然后运算 i=i++, 在最后运算的时候 i 的值使用的是被赋值的临时变量a的值,并非变量本身 即 先运算在赋值 int a=i; i=i+1; i=a, return i; 可以看出i=a=1 ...

。度的博客 1万+

a += 1、a = a + 1、a++区别

1、a += 1 和 a = a + 1 区别 a类型不是int byte a = 1; a += 1;//1默认是int型,a为byte型,a+1有算术运算符,所以a会发生隐式转换变为int型,a+1的结果为int型,运行正常 a = a + 1;//a本身为byte型,不能直接赋值,该行会报错 a = (byte)(a+1);//需要强转,改为a=(byte)(a+1);就不会报错了 a类型是...

陳廿陆的博客 8053

JAVA基础之n+=1与n=n+1的区别

例子: short n = 10; n = n + 1;//编译失败 n += 1; 区别: n += 1;不会改变变量本身的数据类型。 而n = n + 1;编译失败,因为1默认是int,运算的结果n成了int类型。

一个超会写Bug的程序猿的博客 3934

java i++和++i的区别_你真的清楚 i = i++和 i = ++i 的区别吗?

前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛…直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。1、题目packagepers.mobian.questions01;publicclasstest01{...

weixin_39529914的博客 82

详解Java中i++和++i的区别

i++ :先赋值再自增 先在i所在的表达式中使用i的当前值,后让i加1 ++i :先自增再赋值 让i先加1,然后在i所在的表达式中使用i的新值 以下列java代码为例: 运算结果为: 这表明: i++是指先把i=0的值赋值给j, 然后再自身加1; 对于++i: 运算结果为: 表明++i是指先自身加1后赋值给z; 还要注意二者的以下使用不同: // 测试三 i = 0; i+...

Guo_ping'blog 1052

【Java基础】分析在 Java 中 i++ 和 ++i 的区别

分析在 Java 中 i++ 和 ++i 的区别# 刚接触编程时,i++ 与 ++i 这类问题确实难以理解,即使知道它俩区别,还是不能做到学以致用,今天让我带领新手把它给摸透了,看它葫芦里卖的是什么药,高手可以飘过哦~~ 什么是 i++,什么是 ++i i++ 和 ++i 都是 i=i+1 的缩写,唯一区别是执行与引用的顺序。i++ 先引用后计算, ++i 先计算后引用 示例 int i=1; System.out.println(i++); // “先引用,后计算”:首先被 println 方法引用打

Ren_Shuishui的博客 320

i++ 和 ++i 详解

i++ 即后加加,原理是:先自增,然后返回自增之前的值++i 即前加加,原理是:先自增,然后返回自增之后的值一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的表达式。

Gzzz的博客 7987

python中i_python开发_++i,i += 1的区分

在很多编程语言(C/C++,Java等)中我们都会碰到这样的语法:1 int i = 0;2 ++ i; // -- i;这样的语法在上述编程语言中可以实现自增(减),在python中也支持这样的语法,不过在python中这样的用法不是用来自增(减),而是实现数学中的符号运算操作:1 i = 22 ++ i #输出:23 +(+i) #输出:24 -(+i) #输出...

weixin_39859128的博客 973

java i 和i,详解Java中i++和++i的区别

i++ :先赋值再自增先在i所在的表达式中使用i的当前值,后让i加1++i :先自增再赋值让i先加1,然后在i所在的表达式中使用i的新值以下列java代码为例: 运算结果为: 这表明: i++是指先把i=0的值赋值给j, 然后再自身加1;对于++i: 运算结果为: 表明++i是指先自身加1后赋值给z;还要注意二者的以下使用不同:// 测试三i = 0;i++;i++;i++;i++;i++;S...

weixin_30152861的博客 1668
上一篇: 【贪心入门】LeetCode #455 分发饼干
下一篇: 【贪心算法】LeetCode #55 跳跃游戏
Code_Yilia
博客等级 码龄11年 4粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值