代码之家  ›  专栏  ›  技术社区  ›  L. Cornelius Dol

递减循环的最佳习惯用法

  •  4
  • L. Cornelius Dol  · 技术社区  · 16 年前

    递减for循环的最佳/首选习惯用法是什么,为什么?

    for(int idx=(len-1); idx>=0; idx--) {...}
    

    for(int idx=(len-1); idx>-1; idx--) {...}
    

    或者(基于sylvarking的答案,但使用for约束索引范围)

    for(int idx=len; idx-->0; ) {...}
    

    9 回复  |  直到 16 年前
        1
  •  11
  •   erickson    16 年前

    您可能看到的另一个面向阵列的变体是:

    int n = foo.length;
    while (n-- > 0) {
      /* Do something with foo[n] */
    }
    

    • 0 (可以说)比 -1 .
        2
  •  11
  •   L. Cornelius Dol    16 年前

    我推荐以下内容,因为与零的比较是在字节码级别优化的。

    for(int idx=(len-1); idx>=0; idx--) {...}
    

    这是我的建议 Java Performance Tuning 杰克·西拉齐

        3
  •  1
  •   Sean Owen    16 年前

    应该没有性能差异。

    请注意,您的循环迭代最多+1个元素。通常我想我会期望迭代从max-1下降到0。

        4
  •  1
  •   Michael Bobick    16 年前

    有趣的问题!就我个人而言,我使用第一个,这是我看到其他程序员使用最多的一个。我认为原因是人们习惯于测试零,而-1可能会让他们有点失望。

        5
  •  0
  •   Noon Silk    16 年前

    第一个;这是标准的方法。

        6
  •  0
  •   Community Mohan Dere    9 年前

    第二个仍然让我困惑。
    第一个是(或多或少)我们所期望的,在递减for循环中,我们不必检查>-我只是不想拥有平等的人。

    就我个人而言,我也会这么做 Mark Byers 写的。

        7
  •  0
  •   Setien    16 年前

    对于(int idx=(len-1);idx>=0;idx--)

    另外,我更喜欢for循环中的前缀递增/递减运算符(--idx),因为它可以避免获取不必要的idx副本(尽管许多编译器可能会识别并为您修复它)。

        8
  •  -1
  •   Thorbjørn Ravn Andersen    16 年前

    我发现带有计数器的for循环应该 只有

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

    这是如此的确定,你可以期望任何看到这一点的人都能立即理解正在发生的事情。这也意味着,任何与该形式的偏离,通过倒数或从一开始或从三开始,都很难理解,因为您需要识别它是不同的,解析它并理解它。这包括你所有的例子。

    我建议写清楚:

    for(int i = 0; i < MAX; i++) {
      indexFromEnd = (MAX - 1) - i;
    ....
     }
    
        9
  •  -2
  •   crowne    16 年前

    以下示例基于 http://www.java-samples.com/showtutorial.php?tutorialid=235

    class ListIter {
        public static void main(String args[]) {
            // create an array list
            ArrayList al = new ArrayList();
            // add elements to the array list
            al.add("A");
            al.add("B");
            al.add("C");
            al.add("D");
            al.add("E");
            al.add("F");
            // use ListIterator to display contents of al backwards
            ListIterator litr = al.listIterator(al.size());
            while (litr.hasPrevious()) {
    
                Object element = litr.previous();
                System.out.print(element + " ");
    
            }
            System.out.println();
        }
    }