为什么在Java中更改循环计数器是不好的?

时间:2017-02-28 21:39:33

标签: java loops for-loop while-loop programming-languages

我经常听说修改for循环体中的循环计数器是不好的。以下(坏)示例显示了我在说什么。

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

我知道在while循环中允许这样做,但任何人都可以解释为什么这在Java中是一种不好的做法。甚至是任何编程语言中的问题。

3 个答案:

答案 0 :(得分:1)

主要是因为大多数程序员都是这样使用的,所以@AntonH提到的每个人都更具可读性。

旁注:尝试用其他语言(如果内存服务的C)来写:

for(int i =0; i< 10; i){
        printf("%d", i);
        i++;
    }

此代码编译并运行。在Java中,等同于:

for(int i =0; i< 10; i){
        System.out.println("%d", i);
        i++;
    }

编辑感谢@David Wallace :这会产生编译错误,必须在for循环的语句部分中设置一个分配。

答案 1 :(得分:1)

看看这段代码会发生什么:

1 for (int i=0; i<10; i++) {
2     i++;
3 }
  1. 最初第1行i = 0。
  2. 第2行增加i,现在等于1。
  3. 循环结束,所以i ++生效,现在i = 2.
  4. 依旧......
  5. 所以如果你真的想做这样的事情,你可以这样写:

    for (int i=0; i<10; i+=2) {
    }
    

    得到相同的结果。它不一定是糟糕的代码,但是这样的代码没有意义,并且很难排除故障。

答案 2 :(得分:1)

这是坏事的两个原因:

  1. 可读性。对于您在列表上进行迭代的情况,for( a; b; c ) { d; }a; while( b ) { d; c; }的简写。语言并不严格要求。拥有它的全部意义是暗示意图:“我想迭代整个列表”或“我想按顺序遍历列表的一部分,然后在我找到一些东西时中止”。

    如果您添加额外的增量,这会让遇到您代码的其他人感到惊讶。如果您的c上面说的是++x或者其他什么,那么人们只会假设它会循环遍历所有项目,然后才会发现“惊喜!并非总是!”。

    OTOH,如果你使用while循环,人们只会看到这个条件,并且会被警告这将是一个更复杂的循环,其中增量不会是恒定的。

  2. Optimiziation。鉴于上述意图陈述,一些优化器将为for语句生成与while语句不同的代码。虽然它们都不会产生错误的代码,但它们可能会对非顺序访问应用的优化性能优于顺序访问。

    并且“更差的性能特征”我的意思是他们可能会告诉CPU缓存错误的代码路径并将执行速度减慢一小部分周期,因为数据可能必须在被不必要地刷新后再次加载到CPU中