Java中"="自增赋号运算符深入理解
让我们先来看一段代码:
int i = 0 ;
int j = i++;
System.out.println(i);
这个结果大家都知道是:
0
那么我们换一种写法:
int i =0;
i = i++;
System.out.println(i);
大家第一反应是不是以为运算结果还是 1 ?
其实答案是:
0
大家肯定会有疑问 为什么呢?
第一种理解方式
其实大家在"=“号的理解是
右边的值赋值给左边
但是其实”="的真正理解是:
将右边的运算结果赋值给左边
这两句话看似差不多,其实意思差很多
让我们先来看看
int i = 0;
i = i ++;
这两句当中Java做了什么事情
public static void main(String[] args){
int i = 0;
byte var10000 = i;
int var2 = i + 1;
i = var10000;
System.out.println(i);
}
从源码中我们可以看见其实
i++
并不是直接赋值给了
i
而是通过两个中间量进行了运算
i + 1 的值其实赋给了var2临时变量
而 i = var10000临时变量
并且 var10000临时变量的值就等于 i 等于 0
所以这也就是什么
i = i ++
后
i = 0
第二种更加深入的理解方式
通过字节码我们看见这么几行数据:
LocalVariableTable : 本地变量表 (栈空间在压栈的时候,会将本地变量表压进去)
Strat :起始位置
Length :有效范围
Slot : 凹槽 (类似数组的两个索引)
Name : 本地变量的名称
Singature : 类型(I=int)
通过字节码,我们就看出来代码在执行期间,栈做了什么事情
也解释了i为什么是0