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

2021-07-21  本文已影响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=++i(我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i )

上一篇 下一篇

猜你喜欢

热点阅读