分析下面程序输出
public class Topic1 {
public static void main(String[] args) {
int i = 1;
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=4
j=1
k=11
下面根据程序运行的字节码文件进行分析
(int i = 1)
0 iconst_1 ---将int常数1压入操作数栈顶
1 istore_1 ---操作数栈顶值1赋值给int变量i i=1;
(i = i++ )
2 iload_1 ---将i=1的值压入操作数栈顶i
3 iinc 1 by 1 ---变量i执行自增操作
6 istore_1 ---操作数栈顶值2赋值给变量i i=1
(int j = i++)
7 iload_1 ---将i=1压入操作数栈顶
8 iinc 1 by 1 ---变量i执行自增操作
11 istore_2 ---操作数栈顶值2赋值给int变量j i=2,j=1
(int k = i+ ++i*i++)
12 iload_1 ---将i=2压入操作数栈顶
13 iinc 1 by 1 ---执行++i操作 i=3 j=1
16 iload_1 ---将i=3压入操作数栈顶
17 iload_1 ---将i=3压入操作数栈顶
18 iinc 1 by 1 ---变量i执行自增操作 i=4,j=1
21 imul ---将栈顶的两个int型数值相乘后的结果压入栈顶 3*3=9
22 iadd ---将栈顶的两个int型数值相加的结果压入栈顶 2+9=11
23 istore_3 ---操作数栈顶值11赋值给变量k
总结:
- 赋值最后算
- 从左到右依次加载压入操作数栈
- 运算根据运算符优先级进行运算
- 自增等数值操作直接改变变量值,不经过操作数栈
强烈建议去看尚硅谷的视频,讲解的非常清楚 还有图解https://www.bilibili.com/video/BV1Eb411P7bP