C# 4.0 为什么这个整数不递增两次?

C# 4.0 为什么这个整数不递增两次?,c#-4.0,post-increment,C# 4.0,Post Increment,我被下面代码的结果弄糊涂了。为什么在执行这些操作时,“b”保留了一个看似不正确的值 int a = 0; int b = 5; a = b++; b = b++; Console.WriteLine("For b = b++; b=" + b.ToString()); // b should be 7 but it's 6 a = 0; b = 5;

我被下面代码的结果弄糊涂了。为什么在执行这些操作时,“b”保留了一个看似不正确的值

        int a = 0;
        int b = 5;
        a = b++;
        b = b++;            
        Console.WriteLine("For b = b++; b=" + b.ToString()); // b should be 7 but it's 6
        a = 0;
        b = 5;
        a = b--;
        b = b--;            
        Console.WriteLine("For b = b--; b=" + b.ToString()); // b should be 3 but it's 4
        a = 0;
        b = 5;
        a = b + 1;
        b = b + 1;            
        Console.WriteLine("For b = b++; b=" + b.ToString());
输出

          b=6
          b=4
          b=6

有人能解释C#中的这种行为以及它是如何工作的吗?

这确实是后缀操作符的行为,如详细所述

例如,当您编写:

b = b++;
发生以下情况:

  • 保存
    b
    的当前值
  • b
    递增
  • b
    的保存值由后缀
    ++
    运算符生成
  • 操作员产生的值被分配给
    b

  • 因此,
    b
    确实将被分配其原始值,并且递增的值将丢失。

    指令a=b++存储在堆栈上,但不会进行计算,因为此后未使用它

    要获得正确的结果,请使该指令对更改该行的示例有意义:

    Console.WriteLine("For b = b++; b=" + b.ToString());
    
    通过这一点:

    Console.WriteLine("For a = b++; a=" + a.ToString());
    Console.WriteLine("For b = b++; b=" + b.ToString()); //should give 7
    

    因为
    ++
    --
    运算符放置在值之后时,将计算为值本身,然后在计算后增加/减少值

    因此:

    运行此代码后,
    b
    将等于
    0
    a
    将等于
    1

    这与使用运算符作为前缀不同:

    int a = 0;
    int b = ++a;
    
    运行此代码后,
    b
    将等于
    1
    a
    将等于
    1

    这是并且已经存在了。

    当您使用

    int a = 0;
    int b = 5;
    a = b++;
    b = b++;
    
    你把a设为6,然后把b设为6。 当您将b写入命令行时,它显示为6,因为在递增b时从未使用a。 如果你也想使用a,你必须

    int a = 1;
    int b = 5;
    b = b++;
    b += a;
    Console.WriteLine("For b = a + b++; b=" + b.ToString());
    

    但总的来说,我看不出这种增量有任何用处。

    这是的行为,是的。最完美的答案可能是:而且,将增量分配给自身似乎根本上是错误的
    b=b++
    不会导致
    b++=1
    ,并且
    b=++b
    是一种浪费。您确定它会将b的值设为7吗。如果我使用如上所示的“a”?
    int a = 1;
    int b = 5;
    b = b++;
    b += a;
    Console.WriteLine("For b = a + b++; b=" + b.ToString());