java中i = i++和i =++i的深入讲解
作者:最底层的程序员 发布时间:2021-10-04 17:25:48
标签:java,i++,++i
public class Count {
public static void main(String[] args) {
int i = 0;
i = i++ ;
System.out.println(i);
}
}
上面代码输出的i为0,如果是把i = i++换成i=++i,又会输出1,这是由于i++是先赋值,再计算导致,但是为什么先赋值呢?
public static void main(String[] args) {
int i = 0;
i++ ;
}
public static void main(java.lang.String[]);
Code:
0: iconst_0 将int型0推送至栈顶(找到0)
1: istore_1 将栈顶int型数值存入第二个本地变量(变量就是i)
2: iinc 将指定int型变量增加指定值(如i++, i--, i+=2等)
5: return
上图是i++的字节码,++i的和i++的一摸一样,0和1就是最基础的给i赋值为0,iinc就是把i自增。
但是如果加上一个i=i++呢?
// i = i++;
public static void main(java.lang.String[]);
Code:
0: iconst_0 将int型0推送至栈顶
1: istore_1 将栈顶int型数值存入第二个本地变量
2: iload_1 将第二个int型本地变量推送至栈顶
3: iinc 将指定int型变量增加指定值(如i++, i--, i+=2等)
6: istore_1 将栈顶int型数值存入第二个本地变量
7: return
0和1依旧是给i赋值为0,2是把当前i的值推送到栈顶,然后iinc对局部变量表的i进行自增,6是把栈顶的数值赋给i,注意,2的时候推送到栈顶的是0,所以又变回0了。
// i = ++i
public static void main(java.lang.String[]);
Code:
0: iconst_0 将int型0推送至栈顶
1: istore_1 将栈顶int型数值存入第二个本地变量
2: iinc 将指定int型变量增加指定值(如i++, i--, i+=2等)
5: iload_1 将第二个int型本地变量推送至栈顶
6: istore_1 将栈顶int型数值存入第二个本地变量
7: return
i = ++i的时候,iinc往前提了一步,说明,在i的值被压到栈顶前,先进行了自增,所以栈顶的值是1,此时再赋值给局部变量表的里i,就是自增过的。
总结:iinc操作是直接针对局部变量表的,不经过操作栈,i++所谓的先赋值,从字节码层面来看,就是i在进行自增前,先把原来的值存到了操作数栈,所以如果执行b = i++,b之所以等于是i原来的值,就是由于操作数栈的值是自增前的值,而++i的,自增操作提前了,所以b=++i后,b的值和i的值一样。
来源:https://blog.csdn.net/cainiao_xiaoniao/article/details/113454382


猜你喜欢
- MyBatis-PlusMyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改
- 本文实例讲述了C#使用HttpDownLoadHelper下载文件的方法。分享给大家供大家参考。具体实现方法如下:using System;
- 问题背景实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号)。项目中有一个需求是要实时统计一些数据,一个应用下可能有多个相同的账号。
- 场景:在学习JDBC的语言中,每次都执行通用的几步:即注册驱动,获取连接,创建操作,处理结果,释放资源 过于复杂,因此不妨将上述步骤封装成工
- 一、解决方案1声明:jdk1.8已经经过线上环境使用1. 调研JDK8的加密策略存在限制版本和无限制版本,随着越来越多的第三方工具只支持 J
- string t = DateTime.Now.Ticks.ToString();  
- RTF文档即富文本格式(Rich Text Format)的文档。我们在处理文件时,遇到需要对文档格式进行转换时,可以将RTF转为其他格式,
- 从功能上说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群及集群附属功能如restful借口、集群性能检测功能等,数据功能主
- 第一个方法是计算出阶乘然后计算字符串的0的个数。import java.util.Scanner;import java.math.BigD
- 什么是雪花算法雪花算法的本质为生成一个64位长度的具有自增性的分布式全局唯一id。在64bits中,会对不同段的位进行划分。可分为:符号段时
- 案例sql脚本DROP DATABASE IF EXISTS `javacode2018`;CREATE DATABASE `javacod
- 1.应用实例需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片2.代码实现代码实现-文件上传创建 templates/u
- 字符串是由零个或多个字符组成的有限序列,是几乎所有编程语言中可以实现的非常重要和有用的数据类型。在C#语言中,字符串是System.Stri
- kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的反爬虫组件。系统要求基于 spring-boot 开
- C#中List<T>中泛型T如果是一个对象的话,则利用Find函数返回的将是这个对象的指针,对其返回对象的属性进行操作,也会影响
- 前言Intellij IDEA 2017.2.2版本针对Springboot设置了一些特性,本篇文章给大家简单介绍一下如何使用这些特性。Ru
- 前言定时任务动态管理分为两种方式:方式一:Web前台配置Trigger触发器(关联Cron)、ThreadPoolTaskScheduler
- RFC6749OAuth2的官方文档在RFC6749:https://datatracker.ietf.org/doc/html/rfc67
- Jedis简介实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis,对于主流语言,Redis都提供了对应的客户端;提供
- 一、前言文稿扫描大家用的都比较频繁、想是各种证件、文件都可以通过扫描文稿功能保存到手机。相比直接拍照,在扫描文稿时,程序会对图像进行一些矫正