【问题标题】:Writing loops with i++ or ++i [duplicate]用 i++ 或 ++i 编写循环 [重复]
【发布时间】:2013-11-13 20:23:25
【问题描述】:

我有一个关于编写循环的问题。我总是从

(int i=0; i<10; i++)

但我看到很多专家都是这样开始的

(int i=0; i<10; ++i)

有什么真正的区别,还是一样?

当然,我知道前置增量和后置增量之间的区别。我的意思是在编写循环时应该使用哪一个?或视情况而定。

谢谢!

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    通常首选预增量,因为虽然它对原始类型没有影响,但对于迭代器来说可能更快,因为预增量不必返回其旧值的副本。

    由于 preincrement 有时更快(使用非原始类型,如迭代器),因此即使在没有性能差异的情况下也可以进入一个好习惯,这就是许多人推荐它的原因。例如,这是C++ Coding Standards 中的第 28 项。

    【讨论】:

    • 这种情况,有什么语义区别?
    • 在这种情况下没有区别,但问题是为什么“许多专家”更喜欢预增量,答案是因为它在某些情况下会有所不同,所以即使是没有的情况。
    【解决方案2】:

    两者没有区别。前增量和后增量是唯一的 区别。

    i++++i 的区别在于表达式的值。

    i++ 的值是i 在增量之前的值。 ++i 的值是i 增加后的值。

    但是在你的循环中它没有任何区别。

    int i = 0;
    00000088  xor         edx,edx 
    0000008a  mov         dword ptr [ebp-40h],edx 
                i++;
    0000008d  inc         dword ptr [ebp-40h] 
                ++i;
    00000090  inc         dword ptr [ebp-40h] 
    

    如您所见,它对性能没有任何影响,但在某些情况下,您可能希望在序列点之后或之前增加一个数字。

    在 C++ 中,++i 是左值,但 i++ 不是。

    【讨论】:

    • 为什么人们投了反对票...?
    • 我不知道 - 这种情况经常发生在我身上。
    • 在这种情况下(使用 int)没有区别,但与其他类型有区别,这就是首选预增量的原因。
    • @Acme:这个网站总是能快速跳票(上或下)。我已经看到很多错误的答案被投票赞成仅仅因为他们发布了一个正确的事实(而不是一个正确的答案)。
    • 不知道以前不是这样的。
    【解决方案3】:

    前后递增的主要区别在于返回值。
    后递增返回在变量增加之前已经存在的值,本质上是创建旧值的副本。预递增返回对新值的引用,从而避免创建临时变量。
    一般来说,它没有什么区别,主要是个人喜好问题,但在某些内存不足的情况下,预增量选项可能更有用。我还读到后增量版本应该更慢(因为它会创建一个新的临时变量),但我还没有找到任何确凿的证据

    【讨论】:

      【解决方案4】:

      在 C++ 中存在差异。前缀运算符将返回对值的引用,而后缀运算符将返回一个副本,因此比前缀运算符慢。

      【讨论】:

      • 仅当i 的类型是用户定义的且其operator++ 未内联时。
      • 对于许多基本类型,任何体面的编译器都会优化掉这种感知到的性能损失。对于更复杂的类型,这可能是正确的。
      猜你喜欢
      • 2011-05-14
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2016-06-30
      • 2017-07-02
      相关资源
      最近更新 更多