记得刚开始学编程的时候还是从c语言开始的,还是看的谭浩强写的那本书,上面对介绍i++和++i的区别如下: i++是先赋值,然后再自增;++i是先自增,后赋值。 用代码表示就是: 若 a = i++; 则等价于 a=i;i=i+1; 而 a = ++i; 则等价于 i=i+1;a=i; 但是今天遇到一个题目有点迷糊了
按照上面说的 i = i++; 此时 i = 2;但是实际是 1 我们看下字节码
public solution1()V
@Lorg/junit/Test;()
L0
LINENUMBER 16 L0
ICONST_1 // 将 常量1 压入操作数栈中
ISTORE 1 // 出操作数栈并且将 1 赋值给 i 位置为1
L1
LINENUMBER 17 L1
ILOAD 1 // 将1号位置上的变量压入操作数栈中
IINC 1 1 // 将1号位置上的变量自增1 局部变量表中的 此时i = 2
ISTORE 1 // 将操作数栈值赋值给1号位置上的变量 此时i = 1
L2
LINENUMBER 18 L2
ILOAD 1 // 将1号位置上的变量压入操作数栈中 此时i = 1
IINC 1 1 // 将1号位置上的变量自增1 局部变量表中的 此时i = 2
ISTORE 2 // 将操作数栈值赋值给2号位置上的变量 此时j = 1
L3
LINENUMBER 19 L3
ILOAD 1 // 将1号位置上的变量压入操作数栈中 i = 2
IINC 1 1 // 将1号位置上的变量自增1 局部变量表中的 i = 3
ILOAD 1 // 将1号位置上的变量压入操作数栈中 i = 3
ILOAD 1 // 将1号位置上的变量压入操作数栈中 i = 3
IINC 1 1 // 将1号位置上的变量自增1 局部变量表中的 此时i = 4
IMUL // 将最靠近栈顶的变量做乘法 3 x 3 然后写入操作数栈
IADD // 将最靠近栈顶的变量做加法 2 + 9 然后写入操作数栈
ISTORE 3 // 将操作数栈值赋值给3号位置上的变量 k = 3
计算结果
i=4
j=1
k=11
如有不对 欢迎大家指正