【问题标题】:Objective C, difference between n++ and ++nObjective C,n++和++n之间的区别
【发布时间】:2011-06-23 06:33:30
【问题描述】:

在 Objective-C 中,n++ 和 ++n 之间有什么区别(例如,在 for 循环中使用)?

【问题讨论】:

    标签: objective-c operator-keyword increment


    【解决方案1】:

    ++n; 增加n 的值表达式被计算之前。

    n++; 增加n 的值表达式被计算之后。

    所以比较一下这个结果

    int n = 41;
    int o = ++n; //n = 42, o = 42
    

    结果如下:

    int n = 41;
    int o = n++; //n = 42, o = 41
    

    在循环的情况下:

    for (int i = 0; i < j; i++) {/*...*/}
    

    但它没有任何区别,除非你有这样的东西:

    for (int i = 0; i < j; x = i++) {/*...*/}
    

    或者这个:

    for (int i = 0; i < j; x = ++i) {/*...*/}
    

    有人会说:

    使用n++++n 无关紧要,只要在同一个表达式中没有修改(基于n)第二个(相关)变量。


    同样的规则显然适用于--n;n--;

    【讨论】:

    • 好吧,事实是我在 Kochan 的一本非常好的书上学习语言:似乎他说这是风格问题,但他没有解释其中的区别。在我使用的其他语言中,存在差异(您指出的那个)。他只是说“一些程序员更喜欢在变量名之后放置 ++ 或 -- ,如 n++ 或 bean_counter -- 。这是可以接受的,并且是个人喜好问题”。我没有找到关于差异的解释。所以我在这里问。
    • 考虑到我正在阅读有关循环的章节,在这种情况下它可能是有意义的。
    • Objective-C(或更准确地说是 C)中存在差异,只是在所有类似 C 的语言中。 Steven Kochan 可能的意思是,在 90% 的情况下,它没有任何区别。但是,如果做错了,那 10% 会杀死你,这使得在所有其他 90% 的时间里保持一致是值得的,这样你就可以清楚地看到哪里有异常,以及它在哪里确实发生了一次。 (顺便说一句,自从您对此发表评论后,我扩展了我的答案。现在应该让事情变得更加清晰。)
    • @Lotus:让我为你解决这个问题,n++;合法问题恕我直言,如果您考虑到 Steven Kochan 的有争议的话。 (可能想将其添加到您的问题中以澄清您的问题的背景并避免进一步的否决?不知道......)Kochan 的(恕我直言错误)声明提出了一个很好的理由,毕竟它是更知名的 ObjC 初学者书籍之一。跨度>
    • @Regexident:事实是,在您的解释之后,我认为 - 考虑上下文(关于循环的一章) - Kochan 故意避免进一步解释,也许是为了避免混淆。从教学上讲,这本书写得很好……
    【解决方案2】:

    ++n 在使用前递增值(预递增),n++ 在使用后递增(后递增)。

    在 for 循环的上下文中,没有可观察到的区别,因为在循环中的代码执行之后应用了增量。

    【讨论】:

      【解决方案3】:

      ++nn++ 在表达式的计算结果上有所不同。一个例子:

      int n = 0;
      NSLog(@"%d", n);   // 0
      NSLog(@"%d", n++); // still 0, increments afterwards
      NSLog(@"%d", n);   // 1
      NSLog(@"%d", ++n); // 2, because it increments first
      NSLog(@"%d", n);   // 2
      

      【讨论】:

        【解决方案4】:

        在循环中它不会有所作为。有人说++n 更快

        【讨论】:

        • 显示一个循环,其中 ++n 和 n++ 之间的任何成本差异都是可测量的(如果存在这样的差异,这对于现代编译器来说是值得怀疑的),我将向您展示一种最很可能完全次优。
        【解决方案5】:

        在 Scott Meyers “更有效的 C++” 一书中,他提出了一个非常合理的案例,即更喜欢前缀增量而不是后缀增量。简而言之,在那种语言中,由于运算符重载设施前缀增量几乎总是更快。 Objective C 不支持重载运算符,但如果你已经或曾经做过任何 C++ 或 Objective-C++ 编程,那么首选前缀递增是一个很好的习惯。

        请记住,大多数时候 ++n 看起来像:

        n = n + 1 [对 n 做某事]

        而 n++ 看起来像(如果按预期使用):

        寄存器 A = n; //复制n [对 n 做某事] n = A + 1;

        如您所见,后缀案例有更多说明。在简单的 for 循环中,如果很明显不会使用预增量 n 但这种情况会转移到前缀情况,则大多数编译器都足够聪明,可以避免复制。

        我希望这是有道理的。总之,您应该使用前缀,除非您真的想要评估的“副作用”行为,然后增加您从后缀版本中获得的值。

        【讨论】:

          【解决方案6】:

          如上所述,
          --n 在计算表达式之前递减 n 的值。

          n--; 在计算表达式后减小 n 的值。

          这里要注意的是使用while循环时

          例如:

          n = 5
          while(n--) #Runs the loop 5 times
          while(--n) #Runs the loop 4 times
          

          和 n 一样——当 n = 1 时,循环运行额外的时间 但是在 --n 1 中,首先减为 0,然后进行评估。这会导致 while 循环中断。

          【讨论】:

            猜你喜欢
            • 2022-05-04
            • 2019-01-28
            • 2011-01-08
            • 1970-01-01
            • 1970-01-01
            • 2016-05-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多