【问题标题】:Why is this integer not incrementing twice? [duplicate]为什么这个整数不增加两次? [复制]
【发布时间】:2013-10-28 12:22:39
【问题描述】:

我对下面代码的结果感到困惑。为什么在执行这些操作时 '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# 中解释这种行为以及它是如何工作的?

【问题讨论】:

标签: c#-4.0 post-increment


【解决方案1】:

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

例如,当你写:

b = b++;

会发生以下情况:

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

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

【讨论】:

    【解决方案2】:

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

    所以:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      指令 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 的值设为 7。如果我使用 'a' 如上所示?
      【解决方案4】:

      当你使用时

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

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

      【讨论】:

        猜你喜欢
        • 2017-04-13
        • 2016-09-29
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        相关资源
        最近更新 更多