面试题中有时候会出现i=i++类似的情况,如下面代码所示:
public class Test11 { public static void main(String[] args){ int count = 0; for(int i = 0; i < 10; i++){ count = count++; } System.out.println(count);//count=0 } }
在这一片段中,count使用for循环自加10次,但是最后输出的结果仍未0。
程序第一次循环时的详细处理步骤如下:
JVM把count值(其值是0)拷贝到临时变量区。
count值加1,这时候count的值是1。
返回临时变量区的值,注意这个值是0,没修改过。
返回值赋值给count,此时count值被重置成0。
int temp = count; //先把i变量的值10保存到临时变量中 count = count+1; // i变量的值加1操作 count = temp; //再把临时变量中的值赋值给i
public class Test11 { public static void main(String[] args){ int i = 1; i = i++; i = i++; i = i++; i = i++; //i = ++i; System.out.println("i=" + i);//i=1 int j = i++; System.out.println("i=" + i);//i=2 int k = i + ++i * i++; System.out.println("i=" + i);//i=4 System.out.println("j=" + j);//j=1 System.out.println("k=" + k);//k=11 } }
在这一代码片段中i也反复自加,但也是没有丝毫效果。在第一个输出语句中仍输出i=1。
i=i++这种操作似乎并没有改变任何东西,即使将其删除也不会影响输出结果。
但对于j = i++;这种情况,i在程序后面使用时其值自加了1。
这是为什么呢?
int i=1; 这句执行结束后局部变量表中i的值就为1
i=i++; 执行这一句过程如下
①把i的值压入操作数栈,那么操作数栈中值为1
②执行i++操作,那么局部变量表中i的值为2
③最后执行赋值操作,把操作数栈中的值赋值给i,于是局部变量表中i的值被覆盖,变成1,因此i=1
int j=i++
①先把i的值压入操作数栈,那么操作数栈中值为1
②执行i++操作,局部变量表中i的值就变为2
③最后执行赋值操作,此时操作数栈中的值为1,因此j赋值为1,此时j=1,i=2
总结:i=i++这种类型的自加操作,在实际中无意义,相当于兜兜转转又使i回到了原来的值,碰到此类问题甚至可以直接将其删去再分析。
参考链接:
https://blog.csdn.net/qq_44830106/article/details/117604786
https://blog.csdn.net/qq_34137397/article/details/110377711