为什么运行 i=i++ 后       i值不变?
例子:
public class temp {
public static void main(String[] args) {
int i=0;
i=i++;
System.out.println(i);
}
}
运行后输出0我认为i=i++这句是下面两句的合成
i=i;
i++;可是...不对啊...为什么?

解决方案 »

  1.   

    楼主一说才注意到.的确是个问题
    看看这两句:
    int i=0;
    i=i++;
    对应的虚拟机指令:
     0:   iconst_0  //常量0压栈
     1:   istore_1  //将常量0存到局部变量区"1"的位置.这个时候这个"1"位置的值是0
     2:   iload_1  //读出局部变量区"1"位置的值,并压栈.这个时候这个"1"位置的值还是是0
     3:   iinc    1, 1  //最恶心的这句...这是对"++"操作的指令优化,
                          直接将局部变量区"1"位 置的值+1.这个时候这个"1"位置的值变成1了
     6:   istore_1  //将刚才压入栈的值再存回局部变量区"1"的位置.
                      这个时候这个"1"位置的值又变回0了....
      

  2.   

    顶!重大发现啊!难道 i=i++ 中的第一个i和第二个i不是同一个i ?
      

  3.   

    本来就应该是0
    i++返回的值等于i  i=0  所以i++这个表达式=0  i=i++  你又把0赋值给i  所以i还是0
    输出的结果当然是0c语言学的不扎实阿 哈哈
      

  4.   

    1.i++是先使用i再自己加1;
    2.i=i++这个运算式的运算顺序是先执行等号右边的表达式,再将值给左边;
      

  5.   

    右边i++运算后,这个表达式的值的确为0,i的值也变成了1;
    但i=(0)时,虽然i此时为1,但0又赋给这个i了,所以左边的i还是0;(本人见)
      

  6.   

    这和虚拟机的实现有关 如在C++中 计算结果是i=1 ,Java中的计算结果是i=0
      

  7.   

    i++,整个表达式的值是i,然后i值+1
    ++i,i值先+1,然后整个表达式的值是i+1
      

  8.   

    i=i++;意思就是先把值赋予i,然后自身加1;
    i=++i;先自身加1,然后赋予i;初学记住就可以了!没有必要了解根本原理。
      

  9.   

    直接在栈里面操作是很合理的优化,省掉了存取步骤,没什么好恶心的有问题,用JAVAP
      

  10.   

    i++是先给值后自增
    ++i是先自增再把赋值
    所以你的i是不变的
      

  11.   

    i=i++;
    !!!!不会吧,还有这种写法,标准写法是i++;i会自动赋值新值得啊!!!
      

  12.   

    i=i++
    首先是执行i++
    假如i=0
    那么运行完以后i=1
    但是i++=0
    然后把0赋值给了i
      

  13.   

    我觉得只有第三楼的说的对
    其他的都有点臆测的味道
    java虚拟机是怎么工作的我不晓得
    但是c、c++里面就不是这么一回事
    我调试过了
    int i =0;
    i=i++;
    cout<<"i="<<i<<endl;
    结果是1!
    顺序是先i++也就是0
    然后
    i=0;
    再在打印的时候使用自加后的值!也就是1。
      

  14.   

    补充:
    我再看了一些回复
    我说其他都有点臆测,有点不对
    呵呵
    不好意思
    打字打快了
    alex_fantasy()看来也用了c++调试过了,呵呵。
      

  15.   

    public class temp {
    public static void main(String[] args) {
    int i=0,i1=0;
        i=i1++;
    System.out.println(i);
    System.out.println(i1);
    }
    }
    俺也素初学,遇到这种问题基本都是改一下就知道怎么回事儿了.i=1,i1=1.就是先赋值后计算(后++)还是先计算后赋值的问题(前++)
    但是不明白为啥System.out.println(i++);也是0....是不支持表达式赋值吗?
      

  16.   

    试着解释一下,错了可负责哦
    估计i++的实现如下:
    {
    int tem=i;
    i=i+1;
    return tem;
    }
    这样一般情况下i++会返回现在值,然后自加;
    可是当写i=i++时,i自加后又被返回的tem覆盖了,所以i值没变。