美文网首页
经典面试题:i=i++和i=++i

经典面试题:i=i++和i=++i

作者: 云芈山人 | 来源:发表于2021-07-21 14:10 被阅读0次

    问题

    public class Tests {
    
        public static void main(String[] args) {
            int i = 1;
            i = i++;
            System.out.println("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);
        }
        
    }
    

    输出的值:

    i=1
    i=4
    j=1
    k=11
    

    分析

    1. 要谈论这个问题首先要了解内存结构,因为计算是在操作数栈中进行的

    虚拟机栈.png

    局部变量表
    a). 存储方法中的局部变量,包括方法的参数。
    b). 存放编译器可知的各种基本类型(其中64位长度的long和double类型数据占2个局部变量空间(Slot)),引用对象(reference类型,不同于对象本身,可能是指向起始地址的引用指针,也可能是一个指向代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。
    c). 局部变量表的大小在编译期间确定,程序执行期间,大小不会改变。

    操作数栈
    a). 表达式地计算在操作数栈中完成。
    b). 方法开始执行时为空,执行过程中有各种字节码指令往操作数栈中写入和提取内容,即入栈/出栈操作。
    c). 例如:算术运算和参数传递。

    2. 解析步骤

    • 第一步:i = 1 ;


      第一步i=1.png
    • 第二步:i=i++ ;


      第二步i=i++.png

      所以i=i++的输出i仍然为1。

    • 第三步:int j = i++;


      第三步int j=i++.png

      所以,i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1。

    • 第四步:int k = i + ++i * i++


      第四步int k.png

      所以,i=4,k=11。

    注意:i=++i(我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i )

    相关文章

      网友评论

          本文标题:经典面试题:i=i++和i=++i

          本文链接:https://www.haomeiwen.com/subject/qbndmltx.html