【问题标题】:which is better "for(int i = 0; i != 5; ++i)" or "for(int i = 0; i <= 5; i++)"? [duplicate]哪个更好“for(int i = 0; i != 5; ++i)”或“for(int i = 0; i <= 5; i++)”? [复制]
【发布时间】:2011-01-19 09:58:56
【问题描述】:

for(int i = 0; i != 5; ++i)for(int i = 0; i &lt;= 5; i++) 哪个更好?

如果可能,请解释原因。

我在某处读到 != 运算符比比较运算符更好。前自增运算符也比后自增运算符好,因为它不需要任何临时变量来存储中间值。

还有比这两个更好的for循环形式吗?

p.s:我按照其中一位消息来源的建议使用前一个,我现在不记得了。

【问题讨论】:

    标签: c++ c performance for-loop


    【解决方案1】:

    至少有两个区别:

    • 第一个将迭代 5 次(从 0 到 4),而第二个将迭代 6 次(从 0 到 5)。

      这是逻辑上的差异,取决于你需要做什么。

      如果您在第二个示例中的意思是 i&lt;=4(相对于 i!=5),您不必费心:即使关闭优化,任何编译器都始终能够优化这样一个微不足道的表达式。

    • 第二个区别是运算符++的使用:在一种情况下使用前缀版本,而在另一种情况下使用后缀版本。

      这对原生类型没有影响,但可能对用户定义的类型(即类、结构、枚举等)产生一些影响,因为用户可以重载运算符和后缀之一(@987654324 @) 有时可能会慢一些。

    【讨论】:

    • 另外,第一个没有安全性;如果由于某种原因 i 超过 5,则您有一个无限循环。
    • @MiRAGe:如果发生这种情况,则意味着您的程序无法以可预测的方式运行,我认为一般没有必要确保这样的循环不会无限...
    • peoro:这取决于......如果你正在做类似 for (double d = 0; d != x; d += y) 你可能不在乎是否有一些 epsilon 差异阻止d 从完全等于 x,即使在数学上它最终应该:在那种情况下,&lt; 确实更安全。
    • @Tony:迭代浮点值是另一种情况。另一种不同的情况是,当您在类似 STL 的迭代器上进行迭代时:在这种情况下,您不得不使用 !=
    • @MiRAGe:如果将 integer 4 增加 1 不会给你 5,for 语句的样式是你的问题中最少的。
    【解决方案2】:

    使用“i

    所以我总是写“i

    【讨论】:

      【解决方案3】:

      一般来说,你应该为人而不是计算机写作。

      “for(i = 0; i

      正如其他人所说,这种形式确保循环中有趣的代码不太可能导致无限循环。正如其他人所说,使用反映您的意思的形式。

      请注意,“小于”是 c 中常用的习语(这意味着更多的程序员会期望它)。这是更喜欢“for(i = 0; i

      【讨论】:

        【解决方案4】:

        我的 C++ 语言老师告诉我使用规范形式:for(int x=0; x != 5; ++i)

        你其他的工作得很好,但假设你想在迭代器上使用循环。然后

        所以他让我们使用表格

        for(int i=begin; x != end; ++i)for(int i=begin; end != i--; )

        【讨论】:

        • x 是 int 类型,所以变量前后使用 ++ 没有区别
        • 但是,有哪些参考文献支持 != 是规范形式的概念?在我多年的 C++ 编程中,我绝对没有观察到这一点。有关认为 &lt; 是规范形式的人的示例,请参阅 JohnB 的答案。我没有在任何一方权衡,但一些参考资料会很有用。
        • 是的,i++ 是右手变量。所以不能给它赋值。 ++i 是左手变量。
        • @Tony。我在网上找不到他的作品。但这是他为它写的书:icce.rug.nl/documents/cplusplus。但他也在那里使用其他形式。 (这有点典型)但他确实指出迭代器可能会覆盖 != 运算符而不是
        • 这正是我对老师的不满。我以前是个老师。老师想说什么就说什么,学生们把它当作“嗯,这就是我被教的……”。你所学的只是他们的意见,无论是否知情。
        【解决方案5】:

        for(int i = 0; i != 5; ++i) 或 for(int i = 0; i

        第二个,因为它是一个 Bolian 运算符,然后这个 for(int i = _ ; i 即使是编程初学者,它现在也被广泛使用。

        【讨论】:

          【解决方案6】:

          您应该使用&lt;&lt;=!= 等最能表达您的应用程序逻辑的任何一个,但如果没有理由偏爱任何特定样式,那么请保持一致。在通知该决定时,&lt;!= 运算符的优势在于允许在基于 0 的索引和 sizeof 或 STL 样式的 size / length 值之间进行比较,如下所示:

          for (size_t i = 0; i < my_vector.size(); ++i)
              ...
          

          &lt;&lt;= 运算符有时会防止递增超过终止值(如果循环内有另一个条件可以递增/添加到 i,或者有一些浮点舍入/代表性差异)。通常并不重要,但偶尔保存一个错误总比没有好。

          鉴于“< 还传达了循环运行的状态……一个更积极的断言,而不是!= 风格。一般来说,在编程中不鼓励否定断言(例如,bool invalidbool valid 更复杂,尤其是在复杂的布尔表达式和引入双重否定时)。

          这当然适用于数字类型。其他类型可能意味着其他样式...例如,使用!= sentinel。我更喜欢让运算符的选择帮助记录类型的这些使用含义,尽管这是个人选择并且可以说是多余的。

          否则,对于复杂类型,前置增量可能比后置更有效,因为它避免了临时性。

          【讨论】:

            【解决方案7】:

            条件 != 比

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-09-17
              • 2019-06-25
              • 2011-07-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-07
              • 2021-06-09
              相关资源
              最近更新 更多