面试题中有时候会出现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回到了原来的值,碰到此类问题可以直接将“++”删去再分析即可。
- 包括i *= i++, i /= i++, i -= i++这种情况,也可以直接无视“++”去分析。
int a = 2;
a *= a++;
System.out.println(a);//4
a *= a++;
System.out.println(a);//16
a /= a++;
System.out.println(a);//1
a -= a++;
System.out.println(a);//0
参考链接:
https://blog.csdn.net/qq_44830106/article/details/117604786
https://blog.csdn.net/qq_34137397/article/details/110377711