问题 循环条件:为什么“不等于”而不是“低于”


我被分配到一个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,指定明确定义的范围)。

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


4968
2018-04-16 15:12


起源

我有类似的东西 i != negative number 一次在MS-DOS程序中,16位整数移植到MacOS / Unix,32位整数导致突然减速。 ++i 将四处增加到负范围。 - Joop Eggen
0 <= i < count 在数学上是精确定义允许值,而在集合中 i != count 包括所有其他值作为有效候选值作为值 i,不是一个好的前提开始。 - S.D.


答案:


第二种形式有一个明显的优势:如果你有一些错误操纵 i 在循环内部,如果第一个表单可能会崩溃 i get被赋值给大于的值 mjk.length 第二种形式将简单地结束循环。

我在第二种方法中可以看到的唯一一个优点是“!=”可能比“<”运行得更快,但我甚至不确定这种情况会发生(这可能取决于JVM实现和硬件本身。)但是请注意,如果你在循环中做了一些事情,那么差异就不会被注意到,因为它每次迭代只执行一次。

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


6
2018-04-16 15:21



当崩溃显示错误时隐藏错误会是一个优势吗? - MaciejGórski
你可能会这样做,试图找到代码中的错误,但不应该定期使用它 - Mppl
这不是一个优势。程序崩溃往往(可能最常见,甚至几乎总是)比给出错误的结果更好。不要编写静默隐藏错误的代码。 - Thomas Padron-McCarthy


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

从技术上讲,比较可能会占用较少的CPU时间(虽然不太熟悉),但效果很小或者说无关紧要,它不会破坏任何程序的性能...... :)


4
2018-04-16 15:20





我认为编写代码的人可能会喜欢容器(地图,矢量)(!!)

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


2
2018-04-16 15:34



非常好点! - Thomas Calc


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

有利于它的论点是i在退出循环时的值更清楚 - 即一目了然,在循环退出时我会==计数。


1
2018-04-16 15:54





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

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

当然有系统(生命支持,飞机控制等),任何结果都比停止的程序更好。但是,作为一般规则,假设这是不明智的。


1
2018-04-16 19:35