int x = 8;
 x = x++;
 Console.WriteLine("x={0}", x); 为什么输出的值为8?
 Console.ReadKey();
 int x = 8;
            int y;
            y = x++;
            Console.WriteLine("y={0}", y);
            Console.WriteLine("x={0}", x);为什么输出的值为9?
            Console.ReadKey();          

解决方案 »

  1.   

     y=x++ 的意思是把x的值赋给y,x本身再+1,这样应该能解释了吧
      

  2.   


                int x = 8;
    00000038  mov         dword ptr [ebp-44h],8 
                x = x++;
    0000003f  mov         eax,dword ptr [ebp-44h] 
    00000042  mov         dword ptr [ebp-48h],eax 
    00000045  inc         dword ptr [ebp-44h] 
    00000048  mov         eax,dword ptr [ebp-48h] 
    0000004b  mov         dword ptr [ebp-44h],eax 不知你看汇编能否看出来问什么吗
      

  3.   

    int x = 8;
     x = x++;
     Console.WriteLine("x={0}", x); 为什么输出的值为8?
     Console.ReadKey();
    ——————————————————————
    此处x++变成了9,之后返回的是++前的值,也就是8,这个地方是前置++和后置的区别,lz可以去百度一下,之后返回的8又赋值给了x,之后x的值当然就是8了
     int x = 8;
      int y;
      y = x++;
      Console.WriteLine("y={0}", y);
      Console.WriteLine("x={0}", x);为什么输出的值为9?
      Console.ReadKey();
    ——————————————————————
    如果上面的lz看懂了,这部分就容易理解了,x++变成9,之后返回的是++之前的8赋值给y,打印的时候结果就可想而知了!
      

  4.   

    ++x和x++,都是个表达式,最后的结果就取决于是先加,还是后加,如果是先加,那么最后的表达式的结果就是a的值加1,如果是后加的话,则表达式的值就是原来a的值;而无论是先加,还是后加,a的值计算后一定会加1。你的例子中
    int x = 8;
     x = x++;
     Console.WriteLine("x={0}", x); 不要被
     x = x++;这句迷惑。也可以这么理解:
    x++就是x=x+1,其含义就是现将后面的x赋值给前面的x然后再加1.
    ++x就是x=1+x,其含义就是先对后面的x加1然后再赋值给前面的1.
    但这只是在表达式中.
    如果在单独的语句中二者都没有什么区别!
      

  5.   

    经测试,楼主在误导人
    两个都是8,,,
    初步估计,出现上面的原因可能有三个:
    原因一:楼主可能是让x++,运行了两次;
    原因二:下面的可能是++x,而不是x++;
    原因三:楼主是在开玩笑。
    回答完毕
      

  6.   

    乱讲...7、8楼正确,这问题看看MSDN就一清二楚了...返回值不一样而已...
      

  7.   

    难道第一个例子中的x=x++, 前后两个x表示的不是一个变量麽,在内存中的地址不是一样的麽
      

  8.   

    估计lz看不懂汇编,我来分析下:
    ebp是堆栈指针寄存器。局部变量是在堆栈上分配的。并且堆栈是从低地址往高地址存。ebp指向栈顶。
    ebp-44h代表x变量指针。
    int x = 8就是把8放入[ebp-44h]。0000003f  mov         eax,dword ptr [ebp-44h]  ;eax = x (eax = 8)
    00000042  mov         dword ptr [ebp-48h],eax  ;temp = *(ebp-48h) temp = eax (temp = 8)
    00000045  inc         dword ptr [ebp-44h]      ;x = x + 1 (x = 9)
    00000048  mov         eax,dword ptr [ebp-48h]  ;eax = temp (eax = 8)
    0000004b  mov         dword ptr [ebp-44h],eax  ;x = eax (x = 8)
    所以 x 还是 8。
      

  9.   

    前置运算和后置运算int i = 2;
    i ++;      //后置运算
    ++ i;      //前置运算
    后置运算先输出,后运算
    前置运算先计算,后输出int i = 5;
    Console.WriteLine(i++);   //5
    Console.WriteLine(++i);   //7;
    Console.WriteLine(--i);   //6
    Console.WriteLine(i--);   //6
      

  10.   

    我测试了一下,确实很奇怪,楼主说的关键不是前加后加的问题。
    而是借助一个中间变量y
    int x = 8;
    x = x++;
    ----
    int x = 8;
    int y;
    y = x++;
    却让标识是从8变成9的问题,按说,等号应该优先级最低,第一种方法和第二种方法应该是一样的。
      

  11.   

    x++和++x的表达式返回结果是和编译器有关的
    用不同的编译器编译这个,会有不同的结果。
    但单独使用的时候,x的值被加1这个是肯定的
      

  12.   

    “不同编译器有不同的结果”这个确实是如此。lz可以再试试语句 x = (x++) + (x++);
    看看上面那一种解释经得起这个新的测试用例来测试。
      

  13.   

    那看来只有我和bdmh的了哈哈。从汇编分析肯定没错。
    sp1234说得对,好像想起来了,这个属于在C语言里面没有定义的,编译器可以根据需要自行优化。