int i = 0;
i = i ++;
这种表达式考察的是回答者对于JVM中运算器的运算机制的掌握。
这种在同一个表达式中对同一个变量多次赋值的写法是不会在开发中写到的(因为多次赋值必然会发生值的覆盖,毫无意义)。
一般见于IT公司进行Java程序员招聘的面试题里。
以我们之前所学的知识,
i = i ++
可以分成以下两句:
i = i; //此时i依然为0
i ++; // i = i + 1, 此时i变为1
所以很多人认为答案会是1
先统一一下答案好吧。最终i的值为0,也就是说i的值并没有发生任何改变。
废话不多说,说下为什么。
第一句把0赋值给i应该没有什么问题。
问题就在于第二句的 i = i ++;
众所周知,“=”的优先级是大于后置“++”的。所以程序先将变量 i 的值 0 取出放入栈中,准备赋值。此时执行到 i ++ ,变量 i 的值自增为 1 ,此时的确是 i = 1 。接下来继续执行赋值语句,由于之前JVM已经将 i 的值 0 入栈,此时JVM并不知道 i 的值已经发生了改变,便直接将栈中预存的 i 的值也就是 0 取出进行赋值。遂将刚赋完值的 i = 1 覆盖为 i = 0。故最终结果为0。
笔者实力有限,若想深究,出门左转-->JVM工作原理。