为什么这个整数不会递增两次?

时间:2013-10-28 12:22:40

标签: 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;
        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#中解释这种行为以及它是如何工作的吗?

4 个答案:

答案 0 :(得分:4)

这确实是后缀运算符的行为,详见here

例如,当你写:

b = b++;

发生以下情况:

  1. 保存b的当前值
  2. b递增,
  3. b的保存值由后缀++运算符
  4. 生成
  5. 运营商生成的值分配给b
  6. 因此,b确实将被赋予其原始值,并且递增的值将丢失。

答案 1 :(得分:1)

因为放在值之后的++--运算符将计算为值本身,然后在评估之后递增/递减值。

所以:

int a = 0;
int b = a++;

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

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

int a = 0;
int b = ++a;

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

这是documented behavior,并且一直存在a long time

答案 2 :(得分:0)

指令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

答案 3 :(得分:0)

使用时

int a = 0;
int b = 5;
a = b++;
b = b++;

您将a设置为6,然后将b设置为6。 当你将b写入命令行时,它会显示6,因为在递增b时从未使用过a。 如果你想使用一个,你必须做

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

但总的来说,我认为这种增量没有任何用处。