【问题标题】:In C# what is the difference between myInt++ and ++myInt?在 C# 中,myInt++ 和 ++myInt 有什么区别?
【发布时间】:2010-10-01 00:34:00
【问题描述】:

我很难理解以这种方式在 C# 中递增变量的区别是什么:

myInt++;

++myInt;

什么时候会在乎你使用哪一个?

我会给 voteCount++ 的最佳答案。还是我应该给它 ++voteCount...

【问题讨论】:

    标签: c# syntax


    【解决方案1】:

    单独编写时没有区别(如图所示) - 在这两种情况下 myInt 都将递增 1。

    但是在表达式中使用它时会有所不同,例如像这样:

    MyFunction(++myInt);
    MyFunction(myInt++);
    

    在第一种情况下,myInt 递增,新的/递增的值被传递给 MyFunction()。在第二种情况下,将 myInt 的旧值传递给 MyFunction()(但 myInt 在调用函数之前仍会递增)。

    另一个例子是这样的:

    int myInt = 1;
    int a = ++myInt;
    // myInt is incremented by one and then assigned to a.
    // Both myInt and a are now 2.
    int b = myInt++;
    // myInt is assigned to b and then incremented by one.
    // b is now 2, myInt is now 3
    

    顺便说一句:正如Don 在评论中指出的,相同的规则也适用于减量操作,这些操作的正确术语是:

    ++i; // pre-increment
    i++; // post-increment
    --i; // pre-decrement
    i--; // post-decrement
    

    正如Jon Skeet 指出的那样:

    其他人已经展示了它在哪里制作 差异,并评论为 一个单一的声明它不会做出 区别。

    我想补充一点,差不多 在哪里使用它总是一个坏主意 有所作为。我怀疑那里 有时可能更多 可读的代码如下:

    Console.WriteLine("Foo: {0}", foo++);
    

    比:

    Console.WriteLine("Foo: {0}", foo);
    foo++; 
    

    ...但它们非常罕见!这 这两个样本中的后者使 立即订购晶莹剔透 - 前者需要一点思考 (无论如何,对我可怜的大脑来说)。考虑到 首先是可读性。

    【讨论】:

    • ++myInt 通常快一条指令,但这显然可以由编译器优化
    • 你确定在调用函数后它会增加吗?我记得读过一个线程,他们说它在调用之前递增,但旧值作为参数提供给函数。当 myInt 在函数中也可见时,它会产生差异。在 c++ 中也是如此。
    • @litb:你说得对,我会更新答案。非常感谢。
    • Martin,太好了,你得到了 +1 :) 我不知道为什么那个人在没有明显问过你之前就把 Jon 的答案放进了你的答案中(毕竟,Jon 在下面得到了他自己的好答案)。但你似乎喜欢这样。无论如何,在我做这些事情之前我会问 ppl。玩得开心!
    • 为了这个解释清楚的答案的完整性,您可能想提及这个普遍接受的术语,即前增量和后增量(您也可以注意到这同样适用于减量 x- - vs --x)很好的答案。
    【解决方案2】:

    其他人已经展示了它在哪里有所作为,并评论说作为一个单一的陈述它没有任何区别。

    我想补充一点,在有影响的地方使用它几乎总是一个坏主意。我怀疑可能在某些时候使用以下代码更具可读性:

    Console.WriteLine("Foo: {0}", foo++);
    

    比:

    Console.WriteLine("Foo: {0}", foo);
    foo++;
    

    ...但它们非常罕见!这两个样本中的后者立即使订购变得清晰 - 前者需要一些思考(无论如何,对于我可怜的大脑)。首先考虑可读性。

    【讨论】:

      【解决方案3】:

      除非它在表达式中,否则不会,即

      myInt=1;
      x=myInt++;
      

      不同于:

      myInt=1;
      x=++myInt;
      

      第一个将 1 分配给 x,因为分配发生在增量之前。

      第二个将 2 分配给 x,因为分配发生在增量之后。

      【讨论】:

        【解决方案4】:

        在赋值或表达式中,例如

        x = ++myInt; // x = myInt + 1
        x = myInt++; // x = myInt
        

        这也可以用在 for 循环或 if 语句等表达式中。例如,在 seek 为 0 且 count 为 3 的情况下进行以下操作。

        while(seek++ < count) {
           Console.WriteLine(seek);
        }
        

        输出 1、2 和 3,用于搜索,以及以下

        while(++seek < count) {
           Console.WriteLine(seek);
        }
        

        搜索结果为 1 和 2。所以 ++myInt 在计算其值之前递增 myInt,而 myInt++ 在计算后递增。

        【讨论】:

          【解决方案5】:

          myInt++(4 个 CPU 指令)

          LOAD AX, #myInt // From myInt memory to a CPU register
          COPY AX, BX
          INCREMENT BX
          STORE BX, #myInt
          // Use AX register for the value
          

          ++myInt(3 个 CPU 指令)

          LOAD AX, #myInt // From myInt memory to a CPU register
          INCREMENT AX
          STORE AX, #myInt
          // Use AX register for the value
          

          【讨论】:

          • 一般来说,“在我所知道的语言/编译器 X 中”,“仅在语言/编译器 X 中”...?
          • 正如我对 CPU 及其寄存器基本概念的 CS 本科水平的理解所告诉我的那样。我不知道现代CPU指令。但是,我相信任何 CPU 中都没有 CPU 指令可以将内存地址的值加一。
          • 这实际上不适用于 C#
          【解决方案6】:

          如果你在做,那就不同了

          int x = 7;
          int x2 = x++;
          
          => x2 is 7 and x is 8
          

          但是在做的时候

          int x = 7;
          int x2 = ++x;
          
          => x2 is 8 and x is 8
          

          【讨论】:

            【解决方案7】:

            前缀运算符 ++myInt 是一种减少行数的方法:在将变量传递到其他地方之前递增变量。这也是降低可读性的好方法,因为它不常见。

            MyMethod(++myInt); 
            

            对比

            myInt++; 
            MyMethod(myInt);
            

            对我来说,第二个更容易阅读。

            【讨论】:

            • 伟大的思想都一样。 (我会留下第三方来提供另一半……)
            • 我会重构第二个,让它看起来像心跳中的第一个。
            【解决方案8】:

            它决定何时返回该操作的结果。

            这是来自MSDN site 的示例:

            static void Main() 
            {
                double x;
                x = 1.5;
                Console.WriteLine(++x);
                x = 1.5;
                Console.WriteLine(x++);
                Console.WriteLine(x);
            }
            

            然后输出:

            2.5
            1.5
            2.5
            

            【讨论】:

              【解决方案9】:

              我认为按照评估修改的顺序来理解是最简单的。

              • 后缀运算符 (x++) 首先评估,最后修改
              • 前缀运算符 (++x)修改 第一和评估最后。

              (操作顺序在运算符和变量的键入顺序中很明显)

              即当在表达式中使用时,后缀运算符在应用运算符之前计算并使用表达式中变量的当前值(返回语句或方法调用)。使用前缀运算符则相反。

              【讨论】:

                【解决方案10】:

                ++myInt 会在执行相关行之前给 myInt 添加一个,myInt++ 会在之后执行。

                例子:

                int myInt;
                
                myInt = 1;
                someFunction(++myInt); // Sends 2 as the parameter
                
                myInt = 1;
                someFunction(myInt++); // Sends 1 as the parameter
                

                【讨论】:

                  【解决方案11】:

                  如果你做这样的事情:

                  int myInt = 5;
                  
                  Foo(++myInt);
                  
                  void Foo(int x)
                  {
                     Console.WriteLine(x);
                  }
                  

                  这将打印出 6。

                  Foo(myInt++);
                  

                  将打印出 5;

                  基本上,++myInt 递增 FIRST 使用变量 SECOND。 myInt++ 正好相反。

                  【讨论】:

                    猜你喜欢
                    • 2011-08-05
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-06-12
                    • 2011-04-05
                    • 2014-03-01
                    • 1970-01-01
                    • 2011-04-02
                    • 2010-11-18
                    相关资源
                    最近更新 更多