i++为什么没有自增探析——JVM中i++的实现
来源:互联网 发布:程序员40岁以后出路 编辑:程序博客网 时间:2024/06/11 23:43
很多朋友在使用Java时候会发现一个很奇怪的现象。
那就是使用下列的短句时会发现i没有自增,这是很让人迷惑的,因为大家印象中,虽然i++优先级较低,但是总是会自增的,这里为什么i++没有自增?
i=i++;
实质上我们可以将i++与++i对比下
i++的情况
iload_1 iinc 1,1 istore_1++i的情况
iinc 1,1 iload_1 istore_1
jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。
而i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1。
下面这张图就反映了i++的简单流程,先将变量区的i值存入堆栈区,变量区的i再自增1,最后由于是赋值操作,从堆栈区取出i值赋给变量区。因此i依然为最开始保存在堆栈区的i值。
而如果是赋值给其他的变量呢?为什么i++能够实现自增呢?这里我们举出一个语句的例子:
j=i++;
具体过程看下面的图就会明白了.
0 0
- i++为什么没有自增探析——JVM中i++的实现
- i=i++表达式的值为什么没有变化?
- 为什么调试中i的值它说没有这个符号阿?
- java和C++中自增i++的区别
- 为什么i++后,i++的值不变
- JVM(PART I)—Java内存
- 简单的i++ ++i实现
- 为什么++i 优于 i++
- i = i++为什么会是i原来的值??
- i = i++ 之后 i 的值为什么是 0
- 关于java中i++,++i和i++ + ++i的问题
- linux的页表为什么没有实现自映射
- 【前缀自增/减++i】和【后缀自增/减i++】的区别
- 有关自增自加的奇怪问题i++和++i
- C语言自增自减,i++和++i的区别
- 关于java里面的自增自减运算(i++和++i)
- 自增(i++)、自减(i--)运算符的学习笔记
- Python中变量自增、i+=x与i=i+x、is与==
- 张振风案
- Telnet与Java实现
- sgu 136解题记录
- poj 3461 Oulipo(数据结构:kmp)
- LeetCode | Edit Distance(字符串编辑距离)
- i++为什么没有自增探析——JVM中i++的实现
- 从头到尾彻底理解KMP
- uva 12230 - Crossing Rivers(概率)
- Oracle 11g 密码设置为不过期
- hdu 1298 T9
- hdu 2095 找数不同的一个
- 转,Android实战技巧:如何在ScrollView中嵌套ListView
- POJ训练计划3277_City Horizon(扫描线/线段树+离散)
- Connection is read-only. Queries leading to data modification are not allowed