上班摸鱼的时候群里发了个面试题
public class IncTest { public static void main(String args[]){ IncTest inc = new IncTest (); int i = 0; inc.add(i); i = i++; System.out.println(i); } void add(int i){ i++; } }
求解这个最后输出什么,然后我就不加思索的回答 1 就发现自己错了
就是这个i = i++的问题
应该是先赋值 再 计算 所以
i = i = 0 然后 i ++ = 1
输出1 看似没有任何问题咯
but 程序执行应该是如下的样子
void testi();
Code:
0: iconst_0 // 生成整数0
1: istore_1 // 将整数0赋值给1号存储单元(即变量i,i=0)
2: iload_1 // 将1号存储单元的值加载到数据栈(此时 i=0,栈顶值为0)
3: iinc 1,1 // 1号存储单元的值+1(此时 i=1)
4: istore_1 // 将数据栈顶的值(0)取出来赋值给1号存储单元(即变量i,此时i=0)
5: return
所以这就不算java逻辑问题 应该是JVM的问题了
简单来说执行逻辑应该是
i = i = 0
i = i ++ = 1
i = i = 0
赋值两次 所以 输出为0
大概就这样吧