【问题标题】:Loop condition: why "not-equal" instead of "lower-than"循环条件:为什么“不等于”而不是“低于”
【发布时间】:2013-04-16 15:12:57
【问题描述】:

我被分配从事一个具有大量(部分遗留)代码库的 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 优化循环(归纳变量、不变量、范围检查迁移到循环序言等),我想知道不相等是否会阻止这种优化(不像低于,它指定一个明确定义的范围)。

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

【问题讨论】:

  • 我曾经在一个 MS-DOS 程序中遇到过类似i != negative number 的内容,该程序将 16 位整数移植到 MacOS/Unix,而 32 位整数导致突然减速。 ++i 将在负数范围内递增。
  • 0 &lt;= i &lt; count 是允许值的数学精确定义,而集合 i != count 包括作为有效候选值的所有其他值作为 i 的值,这不是一个好的前提。

标签: java for-loop


【解决方案1】:

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

我在第二种方法中看到的唯一一个优点是“!=”可能比“

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

【讨论】:

  • 当崩溃显示错误时隐藏错误会是一个优势吗?
  • 你可能会这样做是为了尝试在你的代码中找到错误,但它不应该经常使用
  • 这不是优势。程序崩溃通常(可能是最常见的,甚至几乎总是)比给出错误的结果要好。不要编写默默隐藏错误的代码。
【解决方案2】:

我相信这只是一个没有经验的程序员。一般来说,使用&lt; 来获得更高的健壮性当然总是更好。在乱搞索引的情况下(比如把步长间隔改成i+=2),不会产生死循环。

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

【讨论】:

    【解决方案3】:

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

    因为 != 主要用于遍历容器的元素。例如,遍历任何泛型类型的元素!= 将适用于地图和向量,而

    【讨论】:

      【解决方案4】:

      如果循环变量 i 在循环内不知何故得到了不正确的、超出范围的值,第一个版本将崩溃,而第二个版本将结束循环。

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

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

      【讨论】:

        【解决方案5】:

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

        支持它的论点是退出循环时 i 的值更清晰 - 即一眼就能看出在循环退出时 i == 计数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-23
          • 2015-04-08
          • 2015-08-28
          相关资源
          最近更新 更多