高手都不懂这样用++,都死光了

解决方案 »

  1.   

    我觉得可能涉及到内部编译机制。
      

  2.   

    请看
    public class Temp
    {
    public static void main(String[] args)
    {
    int i=0;
    i=i++;
    }
    }
    的字节码(JDK 1.3.1_01),由javap -c -verbose Temp生成:
    Compiled from Temp.java
    public class test.Temp extends java.lang.Object {
        public test.Temp();
            /* Stack=1, Locals=1, Args_size=1 */
        public static void main(java.lang.String[]);
            /* Stack=1, Locals=2, Args_size=1 */
    }Method test.Temp()
       0 aload_0
       1 invokespecial #9 <Method java.lang.Object()>
       4 returnMethod void main(java.lang.String[])
       0 iconst_0    //将 0 压入堆栈。
       1 istore_1    //弹出 0 并将它存储在局部分变量表中索引为 1 的位置 (i)。
       2 iload_1     //压入索引 1 处的值 (i)。
       3 iinc 1 1    //将存储在索引 1 处的 i 加 1。
       6 istore_1    //弹出 0 并将它存储在局部变量表中索引为 1 的位置 (i)。
       7 return可以看出:“iinc 1 1”把i加1后,“istore_1”又把栈顶的0存入i,所以i的最后结果是0。不知其它的编译器编译出来的字节码是不是和上面的(JDk 1.3.1_01)一样。