之前看视频,讲到一个java代码中的陷阱问题,具体的代码如下:
public class ForTest {
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++){
j = j++;
}
System.out.println(j);
}
}
这里的输出的结果是零。视频里面讲解这里的++运算没有执行,所以导致输出结果为零,我认为这么解释太过简单粗暴。
好奇心涌上,决定看看java的字节码,是不是真的没有执行:
javap -c ForTest
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_2
5: bipush 100
7: if_icmpge 21
10: iload_1
11: iinc 1, 1
14: istore_1
15: iinc 2, 1
18: goto 4
21: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
24: iload_1
25: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
28: return
从以上的字节码可以清晰的看出来,整个代码运行过程中Stack的变化。以下一步步来讲解:
0:将0压入Stack;
1:将栈顶值0赋值给局部变量1(就是 j)
10:将局部变量1压入Stack(这个时候 j = 0);
11:执行自增操作,但是这个过程中,Stack里的值是不会改变的;
14:将栈顶的值(j=0)赋值给局部变量1(就是j);
24:将局部变量1压入Stack(这个时候j还是0),之后就是println输出。
由上面的分析可以看出,++操作是有被执行的,只是执行的时机不对,不能满足我们想要达到的效果。
OK,这个问题到此为止,若有不对,欢迎各位看官指正,共同进步~~