今天看到一个有趣的现象,在程序中编程
Int i=0;
i=i++;
system.out.println(i);
输出结果为0
这是为什么呢,为此我查询了一些资料
首先我们反编译一下class文件 (汇编操作javap –c 类名)
我们了解一下反汇编的基础指令
一、入栈操作:Const、bipush、sipush
上述只用到了const指令
Const的作用就是将常量压入栈中。
二、出栈操作:store
就是将栈顶元素出栈赋值给一个局部变量
三、压栈操作:iload
就是将局部变量代表的数据压入栈中。
四、自增长操作:iinc
就是对给定的局部变量做自增操作。(特别注意,这条指令是少数执行过程中完全不修改数栈的指令,他接受两个参数,第一个是局部变量的引用位置以及累加数)
现在我们重新来解释一下反编译的代码
0: iconst_0
将常量0压入栈中
1: istore_1
将0出栈赋值为i变量
2: iload_1
重新将i的值0入栈
3: iinc 1, 1
进行自增长操作
6: istore_1
将栈顶的元素出栈赋值给i
所以这一系列操作,得到的还是i=0;