12

我被分配到一个拥有大量(部分遗留)代码库的 Android-Java(实时游戏)项目上工作。

我看到的大多数循环都是这样的(其中 mjk 通常是一个 Java 数组):

    int count = mjk.length;
    for (int i = 0; i != count; ++i) {
        // Stuff dealing with mjk[i]
    }

我通常写这样的循环:

    int count = mjk.length;
    for (int i = 0; i < count; i++) {
        // Stuff dealing with mjk[i]
    }

知道为什么原作者(到目前为止我无法联系到他)使用以前的表格吗?它在 C++ 中很常见吗?

我问这个的实际原因是 JIT 优化:据我所知,Android 优化循环(归纳变量、不变量、范围检查迁移到循环序言等),我想知道不相等是否会阻止这种优化(不像较低-than,它指定了一个明确定义的范围)。

我只是好奇第一种用法是否比第二种用法有任何优点/缺点(在所有方面)。

4

5 回答 5

6

第二种形式有一个明显的优势:如果您在循环内操作错误,如果将get 分配给大于的值i,第一种形式可能会崩溃,而第二种形式将简单地结束循环。imjk.length

我在第二种方法中看到的唯一优势是“!=”可能比“<”运行得更快,但我什至不确定这是否会发生(这可能取决于 JVM 实现和硬件本身。)但是请注意,如果您在循环内执行一些实质性操作,则根本不会注意到差异,因为它每次迭代只执行一次。

我肯定会使用第二个,因为它更安全。

于 2013-04-16T15:21:57.063 回答
4

我相信这只是一个没有经验的程序员。一般来说,使用 a<来获得更高的鲁棒性当然总是更好。在胡闹索引的情况下(例如通过将步长间隔更改为i+=2),它不会产生无限循环。

从技术上讲,比较可能会使用更少的 CPU 时间(虽然对此不太熟悉),但效果微乎其微或无关紧要,它不会破坏任何程序的性能...... :)

于 2013-04-16T15:20:43.620 回答
3

我认为编写代码的人可能非常喜欢 Containers(maps, vector) (!!)

因为 != 主要用于遍历容器的元素。例如,遍历任何泛型类型的元素 != 将适用于地图和向量,而 < 将仅适用于向量。因此,对于通用时间的迭代元素!= 被使用。而不是我没有发现任何其他优势。(希望专家的建议/纠正)

于 2013-04-16T15:34:51.867 回答
3

如果循环变量i以某种方式在循环内获得了不正确的、超出范围的值,则第一个版本将崩溃,而第二个版本将结束循环。

对于第一个版本,即崩溃的版本,这可能是一个优势。当您的银行运行程序来处理您的资金并且出现错误时,您是否希望程序因明显错误而崩溃,以便他们知道必须修复它,或者它应该默默地继续计算错误的结果?

当然,在某些系统(生命支持、飞机控制等)中,任何结果都会比停止的程序更好。但将其假设为一般规则是不明智的。

于 2013-04-16T19:35:30.017 回答
1

我记得很久以前在编写 c++ 时遇到过这种情况。

支持它的论点是退出循环时 i 的值更清晰 - 即,一目了然,在循环退出时 i == 计数。

于 2013-04-16T15:54:13.687 回答