public class a1{
  public static void main(String[] args){ 
      int x=0;
      x=x++;
      System.out.println("x="+x);      
      
  }
}为什么输出结果为0,而不为1  ???

解决方案 »

  1.   

    JVM 模拟一个基于stack(堆栈)的 CPU。
    也就是说这个CPU里面的存储器是stack结构的,特点是好像一个大坑,先掉进去的最后才能爬出来。
    那么我们看一下你的反汇编代码。int i = 0;
    i++;
    这个反编译出来的是:
       0:iconst_0将常数0推入stack
       1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
       2:iinc1, 1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1
       5:return返回int i = 0;
    i = i + 1;
    反编译的结果是:
       0:iconst_0将常数0推入stack
       1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
       2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值: 0
       3:iconst_1将变量1推入stack,现在stack里面有两个值,依次(推入次序)为: 0, 1
       4:iadd从stack中弹出两个值进行相加,并将结果推入stack,现在stack里面又剩下一个值: 1 (因为0 + 1 = 1)
       5:istore_1从stack中弹出一个值(这个值显然是刚刚算出的1)存储到变量索引为1的位置(也就是我们的i),现在i变成了1
       6:return返回int i = 0;
    i = i ++;
    反编译的结果是:   0:iconst_0将常数0推入stack
       1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
       2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值: 0
       3:iinc1, 1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1
       6:istore_1从stack中弹出一个值(这个值应该是前面2的位置推入的0)存储到变量索引为1的位置(也就是我们的i),现在i又变成了0
       7:return返回
      

  2.   

    int x = 0;
    x=x++;等价于int x = 0;
    int y = x; // 先返回
    x = x + 1; // 后加加
    x = y; // 最后把返回值附给x
      

  3.   

    clgj(亡灵孤腥)能说的简单点??
      

  4.   

    shine333(enihs)int x = 0;
    x=x++;等价于int x = 0;
    int y = x; // 先返回
    x = x + 1; // 后加加
    x = y; // 最后把返回值附给x
    为什么不是:
    x=x;
    x++;
      

  5.   

    int i = 0;
    i = i ++;
    反编译的结果是:   0:iconst_0将常数0推入stack
       1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
       2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值: 0
       3:iinc1, 1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1
       6:istore_1从stack中弹出一个值(这个值应该是前面2的位置推入的0)存储到变量索引为1的位置(也就是我们的i),现在i又变成了0
       7:return返回
    就看这一部分就行了
      

  6.   

    一个表达式/方法,返回处理,也就是从stack中pop出来,必然是在最后x=...,就是将x的值设为某个表达式的运行结果,
    请问这个表达式:x++的返回结果是什么?
      

  7.   

    那么直接写x++;或者是x=x+1;不行吗?
      

  8.   

    我认为结果是0,主要原因是x=x++中的x++是先取值,后++的也就是先把x的值给x,然后在++
    public class a1{
      public static void main(String[] args){ 
          int x=0;
          System.out.println("x="+(x++));      
          
      }
    }
      

  9.   

    顶一下吧
    同意亡灵,涉及JAVA寄存器的原理
    JAVA群,欢迎大家加入讨论!QQ群8595489
      

  10.   

    这个没有问题,绝对是零啊。简单问题怎么弄得如此复杂。
    x++作为一个表达式最后的值就是x,在函数里就是0。然后执行x=0,最后x自然为0。