各种i++和++i面试题测试和过程分析

先看面试题:
第1题:
int i = 5;
求i+=i++;(结果10)

第2题:
int i=12;
求 i+=i-=i*i;(结果-120)

第3题:
int i = 1;
i =i++
int j=i++;
int k = i++ +i*i++;(结果:i为4,j为1,k为11)

第4题:
int i=5;
i= (i++)+(i++)+(++i)+(++i);(结果28)

如果你都做对了就不用往下了。

首先介绍一下局部变量表和操作数栈(可以简单了解一下,看不懂也没关系,应该不会影响看懂分析)
各种i++和++i面试题测试和过程分析
每个方法就是一个栈帧;
每个方法里都有自己的局部变量表和操作数栈(当然还有其他的,这里只是简单的图)

局部变量表: 存放变量的和变量的当前值得
操作数栈: 在进行运算的时候把局部变量表中的值加载到这里边来运行,运算完后再赋值给局部变量表中的变 量,赋值后里边的值就没有了。。

先记住以下几点,很重要,如果分析中有哪里看不懂的可以回过来看看这几句是不是都记住了。
*****总结:(首先需要记住这几点规则)
*1. = 等号赋值最后计算
*2 压入操作数栈是从做往右压入的,计算操作数栈的值是遵循运行级别的
3. ++i先自增,再将i的值压入操作数栈,i++,先将i的值压入操作数栈后再自增
4. 自增自减是不经过操作数栈的,直接在临时变量表中自增、自减
5. 最后赋值前,临时数据在操作数栈中,赋值后栈中就没了
6. i+++i的本质为(i++) +i ,而不是i+(++i),可以看我另一篇文章的测试过程

怎样反编译查看源码:

  • 在class所在的目录cmd进入控制台,执行 javap -verbose Demo1.class

*常见过程的含义:(不全,简单介绍一下)
*
*iconst 加载常量1到操作数栈(bipush也是加载常量到栈)
*istore 将操作数栈的值赋值给局部变量,常量栈中的值没了
*iload 将变量的值加载到操作数栈
*iinc 自增
*iadd 把操作数栈的值做加法

前边都是打基础,正式开始分析:

举个简单的例子:
*int i=1;
*i=++i+i++;

请看分析:各种i++和++i面试题测试和过程分析
后边的过程都很相似,所有并没有很严格的全写,参照第一个分析,最为详细,举一反三即可。
各种i++和++i面试题测试和过程分析

各种i++和++i面试题测试和过程分析
各种i++和++i面试题测试和过程分析

各种i++和++i面试题测试和过程分析

关于这篇文章主要作用:

①分享给遇到同样问题的小伙伴,如果有帮到最好。
②相当于自己的学习笔记,怕自己以后再次遗忘,所以记录方便以后查询和复习。
③全是自己的目前的理解和看法,有的地方肯定描述和分析有问题,也可能会很片面,哪里如果不对还希望在评论里指明,以免误导了其他人。

相关文章: