话不多说,我这里直接上面试题
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了。