问题
public class Tests {
public static void main(String[] args) {
int i = 1;
i = i++;
System.out.println("i="+i);
int j = i++;
int k = i + ++i * i++;
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
}
}
输出的值:
i=1
i=4
j=1
k=11
分析
1. 要谈论这个问题首先要了解内存结构,因为计算是在操作数栈中进行的
虚拟机栈.png局部变量表
a). 存储方法中的局部变量,包括方法的参数。
b). 存放编译器可知的各种基本类型(其中64位长度的long和double类型数据占2个局部变量空间(Slot)),引用对象(reference类型,不同于对象本身,可能是指向起始地址的引用指针,也可能是一个指向代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。
c). 局部变量表的大小在编译期间确定,程序执行期间,大小不会改变。
操作数栈
a). 表达式地计算在操作数栈中完成。
b). 方法开始执行时为空,执行过程中有各种字节码指令往操作数栈中写入和提取内容,即入栈/出栈操作。
c). 例如:算术运算和参数传递。
2. 解析步骤
-
第一步:i = 1 ;
第一步i=1.png -
第二步:i=i++ ;
第二步i=i++.png
所以i=i++的输出i仍然为1。
-
第三步:int j = i++;
第三步int j=i++.png
所以,i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1。
-
第四步:int k = i + ++i * i++
第四步int k.png
所以,i=4,k=11。
注意:i=++i(我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i )。
网友评论