※ 引述《jacky0816 (jacky)》之铭言:
: 新手遇到一个问题
: int i = 5;
: i += i++;
: 跑出来是10
: 请问怎运作的? 为何i++最后没加1
半夜睡不着觉,碰巧看到这个问题,来发表一下自己的理解。
首先,如果在一般工作团队中写出这种code,基本上是被干到飞起,所以请别这么做。
这个问题从Java code是很难解释清楚的,由bytecode理解起来相对容易许多。
这两行程式对应的bytecode大致如下:
0 iconst_5
1 istore_1
2 iload_1
3 iload_1
4 iinc 1 by 1
7 iadd
8 istore_1
这边牵涉到一个重要的名词:operand stack
简化一下可以想像成JVM有一块区域是负责存区域变量,当需要进行运算时,需要将区域变量的值复制一份存到operand stack中再进行实际的运算。
这么一来就容易理解许多了,小弟稍微做一下调整方便说明,情况大致如下:
0 iconst_5 => 这里有一个integer,值为5
1 istore_i => 将5 assign到名为i的变量
2 iload_i => 将i的值push到operand stack
3 iload_i => 将i的值再次push到operand stack,此时stack中有两个5
4 iinc i by 1 => 将i的值+1再assign给i,此时i的值为6,但stack中依然是两个5
7 iadd => 将operand stack中存放的两个值pop出来相加,5+5=10
8 istore_i => 将10再assign给i,最终i=10
这样看来应该就很清楚了,i++并不是没有做,而是assign给i之后,又被后续执行的计算结果给覆蓋掉了。
以上是小弟粗浅的见解,有误请不吝指教。
另外附上i += ++i对应的bytecode,有兴趣的话可以对照看看:
0 iconst_5
1 istore_1
2 iload_1
3 iinc 1 by 1
6 iload_1
7 iadd
8 istore_1