在学习c#时,发现 i=i++;的结果很奇怪 ,具体代码如下:
int i=10;
i=i++;
结果竟然还是 i=10;
按理说,先赋值,再加一,结果应该是i=11;但是结果却是i=10;感觉很是费解,各位高手, 谁能帮我解释一下?谢谢!

解决方案 »

  1.   


    LZ,你完全理解错了,犹如2楼说的一样,你先把 ++ 在前 和 ++ 在后 先理清 。int i=10;
    i=i++;
    i = 10 没错啊。
    如果是这样就不一样了。
    int i=10;
    i=++i;
    那么结果就不一样了
      

  2.   

    printf("Hello World!\n");
    int i = 10;
    i = i++;
    cout<<i<<endl;结果:
    Hello World!
    11
    Press any key to continue先赋值 后加1,没有问题
      

  3.   

    假设代码int i=10;
    i=(i++)*2;你可以这样认为这段代码:int i=10;
    j=i;
    j=j+1;
    i=i*2;首先做的是去临时复制i,而不是赋值。
      

  4.   

    c#解释 i=i++; 相当于这样
    int i=10;
    int tmp = i;
    i=i+1;
    i=tmp;
      

  5.   

    i = i++;1. 取出 i 的值
    2. i 自增
    3. i = 刚刚取出来的值所以 i 最终还是原来的值
      

  6.   

    这是反汇编你程序的MSIL代码
    .method public hidebysig static void  Main(string[] arg) cil managed
    {
      .entrypoint
      // 代码大小       11 (0xb)
      .maxstack  3
      .locals init (int32 V_0)
      IL_0000:  nop
      IL_0001:  ldc.i4.s   10
      IL_0003:  stloc.0
      IL_0004:  ldloc.0
      IL_0005:  dup            栈顶元素复制了 所以说相当于第二个i 原始的i值压下去了
      IL_0006:  ldc.i4.1
      IL_0007:  add            
      IL_0008:  stloc.0
      IL_0009:  stloc.0        最后弹出的是之前原始的i
      IL_000a:  ret
    } // end of method VimeTest::Main我们改成i=++i
    反汇编后就是
    .method public hidebysig static void  Main(string[] arg) cil managed
    {
      .entrypoint
      // 代码大小       11 (0xb)
      .maxstack  2
      .locals init (int32 V_0)
      IL_0000:  nop
      IL_0001:  ldc.i4.s   10
      IL_0003:  stloc.0
      IL_0004:  ldloc.0
      IL_0005:  ldc.i4.1
      IL_0006:  add
      IL_0007:  dup       这里是先加后复制 所以事实上这时候两个i都是11
      IL_0008:  stloc.0
      IL_0009:  stloc.0
      IL_000a:  ret
    } // end of method VimeTest::Main