【问题标题】:not equals versus inequality inside for loop conditionals - in javafor循环条件中的不等于与不等式 - 在java中
【发布时间】:2014-11-23 07:53:06
【问题描述】:

我和我的同事刚刚进行了一场辩论 - 重新点燃了大学的回忆。

特别是我的一位讲师总是这样写他的 for 循环:

for(int i = 0; i != max; i++){ ... }

这对我来说似乎是错误的,因为如果你不小心修改了 i,它有可能让你的程序陷入无限循环,我的同事同意我的观点。

据我所知,最常见的 for 循环编写方式是:

for(int i = 0 ; i < max; i++){ ... }

那么每种方法的优缺点是什么?

【问题讨论】:

    标签: java performance loops boolean logic


    【解决方案1】:

    如果变量在循环中从未发生变异,并且您会增加一个保证从您的起始值(在本例中为 10)达到的值,那么两个循环是等效的。

    如果您决定在增量阶段跳过值,保证完全达到终止条件,那么!= 表单将导致无限循环。

    例子:

    for(int i = 0; i < 10; i += 3) { } // will stop after four iterations
    
    for(int i = 0; i != 10; i += 3) { } // i will exceed 10, and will *not* stop
    

    在决定循环时,一般惯例一直是使用有界不等式而不是严格不等式;也就是说,当它们低于某个值时循环,而不是当它们不某个值时循环。

    保持明确和清楚您正在迭代的内容以及最终条件是什么也是一件好事。如果您指定 !=,下一个阅读代码的人会假定您根本不希望该数字成为下一次迭代的一部分,而实际上意图是达到但不包括在内。

    清晰是这里的关键。

    【讨论】:

      【解决方案2】:

      告诉你的朋友:聪明人知道番茄是fruit and not a vegetable,聪明人知道你不会把番茄放在水果沙拉里。

      要点是:是的,从技术上讲,他可以写这个for(int i = 0; i != max; i++){ ... },但如果其他程序员会读它——他们很可能会质疑原因。保持简单和一致。

      如前所述:如果值在 for 循环内发生变化,您可能会陷入无限循环 - 不要那样做。

      【讨论】:

        【解决方案3】:

        1) 使用第一个循环,想象一下如果在循环内的某个点向i 添加一些东西以使i &gt; max 会发生什么。你刚刚得到了一个巨大的循环。
        当然,你可能真的想执行循环只要i != max,但在这种情况下 while(i != max) 更容易阅读。

        您最好使用第一个循环的唯一方法是,如果您能以某种方式保证i 永远不会超过max

        2) 第二个循环更容易阅读for 循环。

        3) 如果你想循环到max 并包含它怎么办?你必须正确 i != max + 1; i++ 在这种情况下我的第二点成立,第二个循环更容易阅读。

        【讨论】:

        • 我认为它不会是无限的。它只会进行大约 40 亿次迭代,仅此而已。
        • 如果你的内存是无限的。
        • @Voicu 我使用了类似for (int i=1; i!=0; ++i) {...} 的循环来几乎详尽地测试一种方法。几秒钟后终止。
        • i 将溢出并返回到int 的最小值,并从那里继续。在某些时候,它会在您的for 中达到停止条件。
        猜你喜欢
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多