首先转载一篇优秀博文写的比较清晰 https://blog.csdn.net/KooKing_L/article/details/79456280
1.下面程序的输出结果是()
A.0 B.99 C.100 D.101
解析:由于Java中用了中间变量缓存机制,则类似i=i++就类似
temp=j; --------> j=j+1; ------------> j=temp; 所以 上面的题j还是0;
2.以下代码的执行结果是多少?
public void test2() {
int i=0;
i=i++ + ++i;
System.out.println("i="+i);
}
解析:i++和++i使用的不同点在于一个是程序完毕后自增,一个是程序开始之前自增。此时这个问题就是i++,但是先不自增,此时I还是0,然后执行++i,这时候i变成1,执行完成补一下之前i++的加一,此时i实际上就是2.则0+2赋值给i,最终i=2.
3.以下代码的执行结果是多少?
public void test5() {
int j=0;
j = ++j + j++ + j++ + j++;
System.out.println("i="+j);
}
解析:首先有了基础知道(++j=1)+ (j++=1)‘‘j=2’’ +(j++=2)‘‘
j=3’’ +(j++=3)‘‘
j=4’但是赋值运算1+1+2+3=7.’
这里为什么i++没有自增?
i=i++;
实质上我们可以将i++与++i对比下
i++的情况
iload_1
iinc 1,1
istore_1
++i的情况
iinc 1,1
iload_1
istore_1
jvm两个存储区,一是暂存区(堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。
而i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1。先将变量区的i值存入堆栈区,变量区的i再自增1,最后由于是赋值操作,从堆栈区取出i值赋给变量区。因此i依然为最开始保存在堆栈区的i值。
再附上https://blog.csdn.net/qq_43268400/article/details/87739485作者西瓜的链接可以做几个小练习巩固一下。