写在前面:前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛…直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。为此,我也专门写一篇博客,记录我的学习!!!文章目录1、题目2、分析2.1、第一步2.2、第二步2.3、第三步2.4、第四步2.5、结果3、i=++i
1、题目
ackageers.mobian.questions01;ubcclasstest01{
ubcstaticvoidmain(String[]args){
inti=1;
i=i++;
intj=i++;
intk=i+++i*i++;
System.out.rintln("i="+i);
System.out.rintln("j="+j);
System.out.rintln("k="+k);
}
}你能肯定并且准确的说出你的答案吗?2、分析
在做这道题时我们的脑中要有对应的JVM内存结构。其中一个方法对应一个栈帧此题目我们只需要用到栈帧里面的局部变量表和操作数栈2.1、第一步inti=1
只是一个简单的赋值操作2.2、第二步i=i++
结果:i还是等于12.3、第三步intj=i++
结果:i在局部变量表中变成了2,操作数栈中的i值为1,并且将i的值返回给j,即此条语句以后,i=2,j=12.4、第四步intk=i+++i*i++
结果:局部变量表中的i=4,k=112.5、结果3、i=++i
按理说根据上面的分析过程,再来分析i=++i,就很简单了。
我们的i变量先在局部变量表中进行自增,然后再将i进栈,然后再把栈中的数据返回给我们的变量i。
ubcclasstest02{
ubcstaticvoidmain(String[]args){
inti=1;
i=++i;
System.out.rintln(i);结果:i=2
}
}注意:除了i++问题。在此赠送一套最新Java架构项目实战教程+大厂面试题库,想学的点击此处免费获取,小白勿进哦
最后的最后:当我和室友讨论一番之后,发现C语言的计算机制和Java的有些许出入,所以本文的思考过程和计算推导仅针对Java语言