Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java中更改循环计数器不好?_Java_Loops_For Loop_While Loop_Programming Languages - Fatal编程技术网

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

为什么在Java中更改循环计数器不好?,java,loops,for-loop,while-loop,programming-languages,Java,Loops,For Loop,While Loop,Programming Languages,我经常听说在for循环体中修改循环计数器是不好的。下面这个(糟糕的)例子说明了我在说什么 for (int i=0; i<10; i++) { i++; } for(inti=0;i主要是因为大多数程序员都是这样使用它的,所以它对于@antoh提到的每个人都更具可读性 旁注:尝试使用其他语言(如C,如果内存可用)编写: for(int i =0; i< 10; i){ printf("%d", i); i++; } for(int

我经常听说在for循环体中修改循环计数器是不好的。下面这个(糟糕的)例子说明了我在说什么

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

for(inti=0;i主要是因为大多数程序员都是这样使用它的,所以它对于@antoh提到的每个人都更具可读性

旁注:尝试使用其他语言(如C,如果内存可用)编写:

for(int i =0; i< 10; i){
        printf("%d", i);
        i++;
    }
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++;
    }
for(int i=0;i<10;i){
System.out.println(“%d”,i);
i++;
}

编辑感谢@David Wallace:这会产生一个编译错误,必须在for循环的语句部分指定一个赋值。

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

旁注:尝试使用其他语言(如C,如果内存可用)编写:

for(int i =0; i< 10; i){
        printf("%d", i);
        i++;
    }
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++;
    }
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 for(inti=0;i只需看看这个代码会发生什么:

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

1表示(int i=0;i这不好的两个原因:

  • 可读性。
    for(a;b;c){d;}
    a;而(b){d;c;}
    的简写,明确用于迭代列表的情况。这在语言中不是严格需要的。拥有它的全部目的是暗示意图:“我想迭代整个列表”或“我想按顺序迭代列表的一部分,然后在找到某个内容时中止”最多

    如果你增加一个额外的增量,其他人会惊讶地发现你的代码。如果你的
    c
    上面说了
    ++x
    或其他什么,人们会简单地假设它在所有项目上循环,然后发现“惊奇!不总是!”

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

  • 优化。鉴于上述意图声明,一些优化器将为
    for
    语句生成与
    while
    语句不同的代码。尽管它们都不应生成错误的代码,但它们可能会对非顺序访问应用比顺序acc性能更差的优化ess

    我所说的“更糟糕的性能特征”是指,它们可能会告诉CPU缓存错误的代码路径,并将执行速度降低一个周期的一小部分,因为在不必要地刷新数据之后,可能必须再次将数据加载到CPU中


  • 这是不好的两个原因:

  • 可读性。
    for(a;b;c){d;}
    a;而(b){d;c;}
    的简写,明确用于迭代列表的情况。这在语言中不是严格需要的。拥有它的全部目的是暗示意图:“我想迭代整个列表”或我想按顺序迭代列表的一部分,然后在找到“最多”的内容时中止

    如果你增加一个额外的增量,其他人会惊讶地发现你的代码。如果你的
    c
    上面说了
    ++x
    或其他什么,人们会简单地假设它在所有项目上循环,然后发现“惊奇!不总是!”

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

  • 优化。鉴于上述意图声明,一些优化器将为
    for
    语句生成与
    while
    语句不同的代码。尽管它们都不应生成错误的代码,但它们可能会对非顺序访问应用比顺序acc性能更差的优化ess

    我所说的“更糟糕的性能特征”是指,它们可能会告诉CPU缓存错误的代码路径,并将执行速度降低一个周期的一小部分,因为在不必要地刷新数据之后,可能必须再次将数据加载到CPU中


  • 从某种意义上说,这是很糟糕的,因为你不能仅仅通过查看条件来确定你将经历多少次循环,从而使维护变得更加困难。归结到可读性。但没有任何东西明确不允许。感谢快速响应。软件的功能会出现任何问题吗是Java还是Java VM?我听说过其他编程语言中的问题。你有这样的例子吗?在Java或其他C派生语言中没有,好吧。如果条件正确的话就没有。不过,你可能会遇到等式问题(例如:
    for(int I=0;I==10;I++){I+=10;}
    ),或者如果在循环中递增,但在正文中递减(例如:
    (int i=0;iThomas我建议你在@Antoh的评论中听听他的建议,它们都是好的!从某种意义上说,你不能仅仅通过观察条件来确定你将经历多少次循环,这使维护变得更加困难。归结到可读性。但没有任何东西明确不允许这样做。谢谢或者快速响应。是否会出现与软件或Java VM功能相关的问题?我听说其他编程语言存在问题。您有相关的示例吗?Java或其他C派生语言中没有。如果条件正确,则不会。不过,您可能会遇到与等同性相关的问题(例如:
    )(inti=0;i=10;i++){i+=10