一个很有意思的代码陷阱

之前看视频,讲到一个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,这个问题到此为止,若有不对,欢迎各位看官指正,共同进步~~




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值