java中i = i++和i =++i的深入讲解

作者:最底层的程序员 时间:2021-10-04 17:25:48 


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

标签:java,i++,++i
0
投稿

猜你喜欢

  • C#如何防止程序多次运行的技巧

    2022-11-10 01:18:59
  • Java实现求数组最长子序列算法示例

    2023-09-28 12:35:14
  • java数据结构算法稀疏数组示例详解

    2021-09-30 11:47:28
  • C++之异常处理详解

    2023-04-10 10:22:00
  • Java中Spring Boot+Socket实现与html页面的长连接实例详解

    2022-12-24 12:06:12
  • 详解IDEA的快捷键及智能提示

    2023-10-18 07:27:03
  • c#可空类型的作用说明

    2021-12-24 18:00:49
  • Spring Boot中的那些条件判断的实现方法

    2023-04-26 15:02:07
  • Java内存模型(JMM)及happens-before原理

    2023-11-25 00:41:05
  • Android自定义View实现分段选择按钮的实现代码

    2022-09-06 07:46:21
  • java实现一个简单的网络爬虫代码示例

    2021-08-05 13:59:12
  • AndroidStudio接入Unity工程并实现相互跳转的示例代码

    2023-08-06 23:34:51
  • spring boot项目打包成war在tomcat运行的全步骤

    2023-12-17 19:20:36
  • VS2010中lib与dll文件的生成与使用方法

    2023-01-23 11:32:50
  • Java截取字符串的几种方法示例

    2023-11-29 12:36:32
  • 关于springboot 配置文件中属性变量引用方式@@解析

    2023-12-08 21:50:03
  • 解决BigDecimal转long丢失精度的问题

    2022-07-16 13:44:22
  • Java代理模式的深入了解

    2021-06-06 10:24:38
  • mybatis项目CRUD步骤实例详解

    2023-04-21 13:12:00
  • Flutter Navigator路由传参的实现

    2021-12-10 04:46:58
  • asp之家 软件编程 m.aspxhome.com