JavaSE经典面试题--------------------------自增、自减

版权声明:本文为changeyd原创文章,未经changeyd允许不得转载。谢谢合作 https://blog.csdn.net/qq_40223688/article/details/87919798

话不多说,我这里直接上面试题

int i  = 1;

i = i++;

System.out.println(i);

请问输出多少?

说实话,博主第一直接回答了一个2,真的太天真了。

先不说答案,我们先简单分析一下:

第一,这里涉及到一个运算符优先级的问题,那么++的优先级肯定是高于=赋值运算的,

第二,这里又是先运算后赋值,因为++在变量后面。

所以本人脱口而出2,其实错误了,这里涉及到一个栈内存问题,对于jvm虚拟机,它的运算过程可以这么理解:

int i = 1;

int temp = i;

i++;

i = temp;

System.out.println(i);

这样一看,答案肯定是1了,所以对于jvm来说,它是首先定义一个临时变量来接收i的值,之后先进行自增运算,然后将此临时变量又赋值给了值为2的i,从而变为了1。很玄学。

对于此类代码,我们在开发的时候应该尽可能的避免,应该保持代码的可读性。

分析完上面的,我们进一步进行一个稍微复杂点的面试题:

int i = 1;

i = i ++;

int k = i + ++i + i++ ;

System.out.println(i);

System.out.println(k);

我们可以分析一下这个输出会是多少。

毋庸置疑的i肯定是为3了,那么只要重点分析k

int k = i + ++i * i++ ;对于jvm虚拟机来说,它会先声明一个临时变量来接收第一个i,然后对于++i,则会先进行自增运算,在进行乘法运算,对于i++,可以知道他是先进行乘法运算,然后再进行的自增运算,所以该代码可以等值于:

int i = 1;

i = i ++;

int temp = i;

++i;

int k = temp + i * i;

i++;

System.out.println(i);

System.out.println(k);

那么就很好理解了,k为1+2*2=5,i就为3了。

猜你喜欢

转载自blog.csdn.net/qq_40223688/article/details/87919798