【问题标题】:Can someone explain the ++ operator? [duplicate]有人可以解释 ++ 运算符吗? [复制]
【发布时间】:2011-04-05 15:34:41
【问题描述】:

可能重复:
C#: what is the difference between i++ and ++i?

我经常看到这个运算符 (++)。我知道它最终会做什么,但似乎有些规则我不明白。例如,将它放在使用它的变量之前还是之后似乎很重要。有人可以解释一下吗?

【问题讨论】:

    标签: c# operators


    【解决方案1】:

    声明

    x++;
    

    完全等价于

    x = x + 1;
    

    除了 x 只被计算一次(如果它是一个涉及属性 getter 的表达式,这会有所不同)。

    以下两者的区别:

    DoSomething(x++);   // notice x first, then ++
    DoSomething(++x);   // notice ++ first, then x
    

    在第一个中,方法DoSomething 将看到xprevious之前它被增加了。在第二个中,它将看到 new(增加的)值。

    有关详细信息,请参阅 MSDN 上的C# Operators

    可以为您自己的类声明自定义++ 运算符,在这种情况下,运算符可以做一些不同的事情。如果要定义自己的 ++ 运算符,请参阅 MSDN 上的 Operator Overloading Tutorial

    【讨论】:

    • "除了 x 只被评估一次" - 抱歉,你错了。 x++x = x + 1 实际上是完全等价的。请注意,在后一种情况下,x 也仅被评估一次。然后是 set,这也发生在 x++ 中。 (当然,我的评论是指将运算符用作语句,而不是作为另一个调用的一部分,在这种情况下,function(x++)function(x = x + 1) 显然表现不一样)
    • @Michael:你误解了我的意思。如果你写myObj.SomeProperty.SomeValue++,那么SomeProperty getter 只会被调用一次,但如果你写myObj.SomeProperty.SomeValue = myObj.SomeProperty.SomeValue + 1,那么它会被调用两次。
    • 在这种情况下,你是对的, SomeProperty getter 被调用了两次 :-) 只是想指出 SomeValue getter 只会被调用一次。我认为,编译器也可能会优化双重 getter 调用?但这只是一个怀疑。
    • @Michael:任何可以优化它的编译器都会有错误。 C# 规范对预期的副作用非常清晰和明确。毕竟这不是 C++ :)
    • x++ 和 x = x + 1 完全相同是正确的。不相信我?试试吧。字节 x = 0; x++; vs 字节 x = 0; x = x + 1;给出不同的结果,因为其中一个甚至无法编译
    【解决方案2】:

    http://msdn.microsoft.com/en-us/library/36x43w8w(v=VS.80).aspx

    自增运算符 (++) 将其操作数加 1。自增运算符可以出现在其操作数之前或之后:

    第一种形式是前缀递增操作。运算的结果是操作数自增后的值。

    第二种形式是后缀递增操作。运算的结果是操作数在递增之前的值。

    【讨论】:

      【解决方案3】:

      如果您将++ 运算符放在变量之前,则它首先递增。 如果将++ 运算符放在变量后面,则变量后面递增。

      例如(C#):

      int x = 0;
      Console.WriteLine("x is {0}", x++); // Prints x is 0
      
      int y = 0;
      Console.WriteLine("y is {0}", ++y); // Prints y is 1
      

      希望这可以解决问题。

      【讨论】:

      • 虽然这是这个问题的常见答案,但实际上是错误的。增量发生的时间不会根据运算符是前缀还是后缀而改变。变化的是在增量期间计算的临时值被选为运算符的结果。对比这个答案,它指出差异是 当副作用发生时与迈克尔的答案,正确地表明差异是返回哪个值。这是一个微妙但重要的区别。
      • @Eric - 我不知道 :)。感谢您的解释!
      【解决方案4】:

      如果你这样说的话

      variable++
      

      它首先使用变量并递增它(+1) 另一方面,如果你

      ++variable
      

      它首先增加变量然后使用它

      【讨论】:

      • 这个答案也不正确。最后一条语句错误地暗示结果是递增后变量的值,而实际上结果是分配给变量的值。该变量不会被第二次读取。
      • @Eric Lippert 你很注重细节,我不知道。
      【解决方案5】:

      另一种看待它的方式...这里有两个功能与前缀/后缀++相同。这说明前缀在理论上更快,因为不需要临时变量来存储“先前”值:

      // same as x ++;
      int PostfixIncrement(ref int x)
      {
          int y = x;
          x = x + 1;
          return y;
      }
      
      // same as ++ x;
      int PrefixIncrement(ref int x)
      {
          x = x + 1;
          return x;
      }
      

      【讨论】:

        【解决方案6】:

        如果将 ++ 运算符放在变量之前,则它首先递增。如果将 ++ 运算符放在变量后面,则变量后面递增。

        例如(C#):

        int x = 0; Console.WriteLine("x 是 {0}", x++); // 打印 x 为 0

        int y = 0; Console.WriteLine("y 是 {0}", ++y); // 打印 y 是 1

        【讨论】:

        • 不,i=i++ 表示您先递增,然后再将旧值分配回去,从而使操作无用。 i=++i 与简单的++i 具有相同的效果。
        • 是的,正要写一样的。 i=i++ 和类似的例子不利于解释,因为它更容易混淆。
        • 你不应该像那样复制粘贴别人的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 2019-10-10
        • 2019-08-04
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多