头疼
直接上题:
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);
}
}
//答案
i=4
j=1
k=11
看一下字节码:
0 iconst_1
1 istore_1
2 iload_1
3 iinc 1 by 1
6 istore_1
7 iload_1
8 iinc 1 by 1
11 istore_2
12 iload_1
13 iinc 1 by 1
16 iload_1
17 iload_1
18 iinc 1 by 1
21 imul
22 iadd
23 istore_3
24 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
27 iload_1
28 invokevirtual #3 <java/io/PrintStream.println : (I)V>
31 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
34 iload_2
35 invokevirtual #3 <java/io/PrintStream.println : (I)V>
38 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
41 iload_3
42 invokevirtual #3 <java/io/PrintStream.println : (I)V>
45 return
看一下局部变量表:

看一下虚拟机栈的结构:

1.第一步
int i = 1

2.第二步
i = i++

3.第三步
int j = i++

3.第四步
int k = i + ++i * i++
这个可以写成: int k = i+ ((++i) * (i++)) 注意,乘法优先级高,字节码上也能体现出来

总结:就是通过分析字节码,是怎样一步步执行的,要注意的点,就是局部变量表load出来放进操作数栈,注意是栈结构,然后又store存入局部变量表。这样一个过程。所以要深刻理解代码执行逻辑和顺序,以及代码执行优先级,才能应付复杂计算。
最后的最后:本文的思考过程和计算推导仅针对Java语言
转载来自:https://urlify.cn/Abyuyy

被折叠的 条评论
为什么被折叠?



