关于i++和++i的基础面试题讲解

本文深入探讨了Java中i++和++i的底层实现,通过实例代码和反编译结果,揭示了这两个操作在不同场景下的区别和工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

       对于学高级程序设计语言的同学来说,i++和++i这个是最基础的知识,i++不就是先运算再++吗,++i不就是先++再运算吗?结果确实是怎样的,但是呢,底层是如何实现的呢?这个似乎好像不知道哦,接下来就以Java为例来讲解i++与++i的底层秘密。

热身

      观察下面的面试题代码,看看运行的结果是啥呢?

public class Test {
    public static void main(String[] args) {
        fun1(); 
        fun2();
    }

    public static void fun1() {
        int a=15;
        a=a + a++;
        System.err.println(a);//30
    }

    public static void fun2() {
        int a=15;
        a=a + ++a;
        System.err.println(a); //31
    }
}

可能有些小伙伴对输出的结果有点疑问,没事的,运行出来的结果确实是如此的。所以,我们决定康康一  
一下结果为啥是这样的。
  • 首先研究一下fun1()函数
    经过反编译出的源码如下:
 public static void fun1();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=0
         0: bipush        15   //将15push到栈中   
         2: istore_0     // 将15保存到局部变量表0位置中 
         3: iload_0       //将局部变量表0位置的值(15)加载到栈中
         4: iload_0       //将局部变量表0位置的值(15)加载到栈中,此时栈中有15,15两个值
         5: iinc          0, 1  //将0位置局部变量表中的值增加1,此时局部变量表中的值为16
         8: iadd          //将栈中的值进行相加15+15=30
         9: istore_0      //然后将30存放到0位置的局部变量表中,也就是最后执行的值30
        10: getstatic     #3                  // Field java/lang/System.err:Ljava/io/PrintStream;
        13: iload_0
        14: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
        17: return
      LineNumberTable:
        line 8: 0
        line 9: 3
        line 10: 10
        line 11: 17
  • fun2()函数
 public static void fun2();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=0
         0: bipush        15 //将15加载到栈中
         2: istore_0      //栈中pop到0位置的局部变量表中
         3: iload_0       //再将0位置局部变量的值加入到栈中 15
         4: iinc          0, 1 //0位置局部变量的值增加1,此时局部变量值为16
         7: iload_0      //再将0位置的值加载到栈中,此时栈中为 16,15
         8: iadd         //16+15=31
         9: istore_0    //存储到0位置中  答案就是31
        10: getstatic     #3                  // Field java/lang/System.err:Ljava/io/PrintStream;
        13: iload_0
        14: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
        17: return  
      LineNumberTable:
        line 14: 0
        line 15: 3
        line 16: 10
        line 17: 17
}

常见面试题

public static void fun3() {  
        int a=15;
        a=++a + ++a;
        System.err.println(a);//33
    }

    public static void fun4() { 
        int a=15;
        a=++a + a++;
        System.err.println(a);//32
    }

    public static void fun5() { 
        int a=15;
        a=a++ + ++a;
        System.err.println(a);//32
    }

    public static void fun6() { 
        int a=15;
        a=a++ + a++;
        System.err.println(a);//31
    }

今天分享到此结束了,有问题可以评论区留言哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值