有如下一道题目,请给出输出结果:
public class Test {
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
}
下面直接给出结果:
4
1
11
过程分析,这道题主要涉及到我们关于jvm方法执行字节码的过程,包含栈帧,操作数栈,局部变量表的内容。
L0
LINENUMBER 12 L0 #第12行
ICONST_1 #定义i
ISTORE 1 #将i值保存在局部变量表
L1
LINENUMBER 13 L1 #第13行
ILOAD 1 #将i压入操作数栈
IINC 1 1 #局部变量表的i进行++操作,变成2
ISTORE 1 #将操作数栈的i放回到局部变量表中,此时1将2覆盖了,所以i值仍然是1
L2
LINENUMBER 14 L2 #第14行
ILOAD 1 #将i压入操作数栈
IINC 1 1 #局部变量表进行++操作,此时i变成了2
ISTORE 2 #将操作数栈的值赋值给j,保存到局部变量表,此时j是1,i是2
L3
LINENUMBER 15 L3 #第15行
## 以下操作既有加法,又有++操作,还有乘法,但是变量入栈及程序执行顺序仍然是从左自右的
ILOAD 1 #将第一个i压入操作数栈,值是2
IINC 1 1 #执行++操作,此时局部变量表的i值变成了3
ILOAD 1 #将第二个i压入栈,此时压入的i是3
ILOAD 1 #将第三个I压入栈,压入的仍然是3
IINC 1 1 #局部变量表的i再次进行++操作,此时i变成了4
IMUL #此时执行乘法指令,将栈顶的两个3进行相乘,得到9,此处没有赋值操作,所以将9压回操作数栈
IADD #将操作数栈的两个数值相加,即2 和 9 相加,得到 11
ISTORE 3 # 将11赋值给局部变量表的k
总结:
自增自减操作直接修改局部变量表的值,不在操作数栈中操作。
运算符的先后顺序决定操作数栈先运行的命令
临时结果会压回操作数栈
变量都是从左至右依次入栈
网友评论