繁体   English   中英

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

[英]Why is it bad to change for loop counter in Java?

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

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

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

主要是因为大多数程序员都以这种方式使用它,因此@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 for (int i=0; i<10; i++) {
2     i++;
3 }
  1. 最初,第1行i = 0。
  2. 第2行使i递增,现在等于1。
  3. 循环结束,所以i ++生效,现在i = 2。
  4. 等等 ...

因此,如果您真的想做这样的事情,可以这样写:

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

得到相同的结果。 它不一定是不好的代码,但是这样的代码没有任何意义,而且很难进行故障排除。

这很糟糕的两个原因:

  1. 可读性。 for( a; b; c ) { d; } for( a; b; c ) { d; }是a的简写a; while( b ) { d; c; } a; while( b ) { d; c; } a; while( b ) { d; c; }明确表示您要遍历列表。 并非严格要求使用该语言。 拥有它的全部目的是暗示意图:“最多我要遍历整个列表”或“我要依次遍历一部分列表,然后在找到某些内容时中止”。

    如果添加额外的增量,这会使其他人遇到您的代码感到惊讶。 如果上面的c表示++x或其他含义,人们会简单地认为它遍历所有项目,然后才发现“惊奇!并非总是如此!”。

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

  2. 优化。 鉴于上述意图,某些优化器将为for语句生成与while语句不同的代码。 尽管它们都不应该产生错误的代码,但是它们可能会应用优化,其非顺序访问的性能特征要比顺序访问的性能差。

    所谓“更差的性能特征”,是指它们可能告诉CPU缓存错误的代码路径,并使执行速度减慢一个周期的时间,因为在不必要地刷新数据之后,可能必须再次将数据加载到CPU中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM