图解 i++ 和 ++i 的区别!看了必懂

简介: 图解 i++ 和 ++i 的区别!看了必懂

先看一段代码:

```java

int i = 0;

int a = i++;

sout("a的值是:"+i);

sout("i的值是:"+i);

```

最终的编译之后的核心字节码如下

```java

L0

BITPUSH 0  //将常量0压入操作栈

ISTORE_1  //将当前栈顶元素,弹出并保存到局部变量表的slot_1中

L1

ILOAD_1   //从局部变量表的第一个slot槽中,取出该值,压入操作栈顶

IINC 0,1    //直接将slot槽中的值自增(+1)操作,注意此时是与当前栈无关的  

ISTORE_2   //将当前栈顶元素,弹出并保存到局部变量表的slot_2中

L2

ILOAD_2    //从局部变量表的第二个slot槽中,取出该值,压入操作栈顶

 IRETURN  //返回栈顶元素

```

这里有两个注意点:

- `IINC` 的自增操作,并未影响当前的栈顶元素,并且 slot_1 中的元素自增完成后,已经由0变成了1

- `ISTORE_2` 弹出的栈顶元素值依旧是0,并未改变

最终的输出的结果为:

```java

a的值是: 0  

i的值是: 1;

```

#### 我这里画了一个图来帮助大家理解

![图片](https://typora-1302845125.cos.ap-beijing.myqcloud.com/typora����ͼ��/640)

![图片](https://typora-1302845125.cos.ap-beijing.myqcloud.com/typora����ͼ��/640)

![图片](https://typora-1302845125.cos.ap-beijing.myqcloud.com/typora����ͼ��/640)

![图片](https://typora-1302845125.cos.ap-beijing.myqcloud.com/typora����ͼ��/640)

![图片](https://typora-1302845125.cos.ap-beijing.myqcloud.com/typora����ͼ��/640)

![图片](https://typora-1302845125.cos.ap-beijing.myqcloud.com/typora����ͼ��/640)

#### 再来看看++i

```java

int i = 0;

int a = ++i;

sout("a的值是:"+i);

sout("i的值是:"+i);

```

对于++i 来说,对应的字节码如下,先自增再入栈,那么结果就很清晰了

最终的核心编译之后的字节码如下

```java

L0

BITPUSH 0  //将常量0压入操作栈

ISTORE_1  //将当前栈顶元素,弹出并保存到局部变量表的slot_1中

L1

IINC 0,1    //直接将slot槽中的值自增(+1)操作

ILOAD_1   //从局部变量表的第一个slot槽中,取出该值(该值此时已经自增过了),压入操作栈顶

ISTORE_2   //将当前栈顶元素,弹出并保存到局部变量表的slot_2中

L3

ILOAD_2    //从局部变量表的第二个slot槽中,取出该值,压入操作栈顶

IRETURN  //返回栈顶元素

```

最终的输出的结果为:

```java

a的值是: 1  

i的值是: 1;

```

#### 总结

`i++` 和 ++i 在理论上的区别是 :

- `i++`:是先把i拿出来使用,然后再+1;

- `++i` :是先把i+1,然后再拿出来使用;

相关文章
|
8月前
|
编译器 C++
C++初阶--类与对象(3)(图解)
C++初阶--类与对象(3)(图解)
|
2月前
图解一些网络基础知识点
Ethernet以太网IEEE802.3 以太网第一个广泛部署的高速局域网; 以太网数据速率快; 以太网硬件价格便宜,网络造价成本低。
29 4
|
8月前
|
SQL 关系型数据库 MySQL
搞懂connectTimeout和socketTimeout的区别
搞懂connectTimeout和socketTimeout的区别
386 0
|
Kubernetes 容器
图解k8s
图解k8s
75 0
|
算法 搜索推荐
50.【算法图解】
50.【算法图解】
64 0
|
算法 搜索推荐
《图解算法》系列学习(三)
《图解算法》系列学习(三)
《图解算法》系列学习(三)
|
算法 Python
《图解算法》系列学习(二)
《图解算法》系列学习(二)
《图解算法》系列学习(二)
|
算法 程序员 C语言
《图解算法》系列学习(一)
《图解算法》系列学习(一)
《图解算法》系列学习(一)
|
存储 人工智能 分布式计算
算法图解笔记
算法图解笔记
148 0
图解 i++ 和 ++i 的区别,看了必懂...
图解 i++ 和 ++i 的区别,看了必懂...
128 0
图解 i++ 和 ++i 的区别,看了必懂...