2

我对下面代码的结果感到困惑。为什么在执行这些操作时 '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

4 回答 4

4

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

例如,当你写:

b = b++;

会发生以下情况:

  1. 的当前值b被保存,
  2. b递增,
  3. 的保存值b由后缀++运算符产生,
  4. 运算符产生的值被赋值给b

因此,b确实会被赋予其原始值,而增加的值会丢失。

于 2013-10-28T12:28:00.530 回答
1

因为++and--运算符放在值之后会计算值本身,然后在计算后递增/递减值。

所以:

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

运行此代码后,bwill equal0awill equal 1

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

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

运行此代码后,bwill equal1awill equal 1

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

于 2013-10-28T12:28:13.063 回答
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
于 2013-10-28T12:28:03.537 回答
0

当你使用

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());

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

于 2013-10-28T12:39:42.263 回答