java的i++和++i

java的i++和++i

说来惭愧,最近在刷面试题,一道有关于i++和++i的题竟然做错了!网上查了一圈恍然大悟。下面结合我的理解来说说这个问题,避免面试踩坑啊。

准备接招吧

package com.example.demo;

/**
 * @Author: junwe
 * @Date: 2021/2/27 23:15
 */
public class Test {
    public static void main(String[] args) {
        int i = 6;
        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);
    }
}

下面揭晓答案了

image-20210228170415439

如果和你想的一样,恭喜你不用再往下看了。

要做对这题,需要弄清楚局部变量和操作数栈。先看一下main方法对应的字节码(idea查看字节码:右键.class文件,open in terminal,在命令行输入javap -v 类名),“##”的部分是我加的注释。

 public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=4, args_size=1
         0: bipush        6     #6入栈#
         2: istore_1		   #6出栈,赋值给第一个变量i。0-2对应代码int i = 6;#
         3: iload_1			   #第一个变量6入栈#
         4: iinc          1, 1  #第一个变量i=6+1,此时局部变量i=7#
         7: istore_1            #6出栈,赋值给第一个变量i,此时局部变量的值被覆盖为63-7对应代码i = i++;#
         8: iload_1             #第一个变量6入栈#
         9: iinc          1, 1  #第一个变量加一,此时局部变量i=7#
        12: istore_2            #6出栈,赋值给第二个变量j。此时j=68-12对应代码int j = i++;#
        13: iload_1			   #第一个变量7入栈#
        14: iinc          1, 1  #第一个变量加一,此时局部变量i=8#
        17: iload_1			   #第一个变量8入栈#		
        18: iload_1             #第一个变量8入栈#
        19: iinc          1, 1  #第一个变量加一,此时局部变量i=9#
        22: imul                #栈中的两个8分别出栈相乘后64入栈#
        23: iadd                #64和栈低的7出栈相加后71入栈#
        24: istore_3            #71出栈赋值给第三个变量k#

没看懂?再来一张图
image-20210228184559126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值