首先转载一篇优秀博文写的比较清晰 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作者西瓜的链接可以做几个小练习巩固一下。