关于c#4.0:为什么这个整数没有递增两次?

Why is this integer not incrementing twice?

本问题已经有最佳答案,请猛点这里访问。

我对下面代码的结果感到困惑。为什么"b"在执行这些操作时保留了一个看起来不正确的值?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        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());

产量

1
2
3
          b=6
          b=4
          b=6

有人能用C语言解释这种行为吗?它是如何工作的?


这确实是postfix操作符的行为,如本文所述。

例如,当你写:

1
b = b++;

发生以下情况:

  • 保存EDOCX1[0]的当前值,
  • b递增,
  • b的保存值由后缀++运算符产生。
  • 操作员产生的值分配给b
  • 因此,b确实会被赋予它的原值,增加的值会丢失。


    因为当++--操作符放在值之后,会对值本身进行评估,然后在评估之后对值进行递增/递减。

    所以:

    1
    2
    int a = 0;
    int b = a++;

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

    这与使用运算符作为前缀相反:

    1
    2
    int a = 0;
    int b = ++a;

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

    这是记录在案的行为,已经存在很长时间了。


    当你使用

    1
    2
    3
    4
    int a = 0;
    int b = 5;
    a = b++;
    b = b++;

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

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

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


    指令A=B++存储在堆栈上,但没有进行计算,因为之后没有使用它。

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

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

    通过那个:

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