美文网首页
经典面试题: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

    问题 输出的值: 分析 1. 要谈论这个问题首先要了解内存结构,因为计算是在操作数栈中进行的 局部变量表a). 存...

  • Java中的i++ 和 ++i 在for循环使用

    Java的i++ 和++i 的区别i++:先赋值,后计算;++i;先计算,后赋值。 for循环中的i++和++i...

  • i++和++i

    i++ 先赋值后相加 //结果65 ++i 先自加后赋值 //结果66

  • ++i和i++

    ++i和i++ 如果是自身使用,没有任何区别。 使用后再进行赋值时有区别: 前加:先自身+1再把结果赋值给...

  • i++和++i

    java场景一 打印结果: i: 0 j: 1 java场景二 打印结果: i: 0 j: 1

  • ++i和i++

    1.a = i++; 等校为 a = i; i = i + 1; 2.a = ++i; 等校为 i = i ...

  • C语言:乱

    ++i 和 i++ 的作用相当于 i=i+1。但是 ++i 和 i++ 的不同之处在于 ++i 是先执行 i=i+...

  • 自增、赋值运算符

    1.自增 int i = 3; int a = i++ + i++ + i++;//第①个i++表达是值为3,i=...

  • i++和++i的区别

    i++和++i有哪些区别? i++和++i都是实现变量i的自增,两者的区别在于i++是先运算,再加1,而++i是先...

  • i++,++i和i--

    对于i=i++ 赋值运算最后算,先算i++将1压入操作数栈,将i压入局部变量表将i自增,局部变量表中i=2再...

网友评论

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

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