我经常听说修改for循环体中的循环计数器是不好的。以下(坏)示例显示了我在说什么。
for (int i=0; i<10; i++) {
i++;
}
我知道在while循环中允许这样做,但任何人都可以解释为什么这在Java中是一种不好的做法。甚至是任何编程语言中的问题。
答案 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 }
所以如果你真的想做这样的事情,你可以这样写:
for (int i=0; i<10; i+=2) {
}
得到相同的结果。它不一定是糟糕的代码,但是这样的代码没有意义,并且很难排除故障。
答案 2 :(得分:1)
这是坏事的两个原因:
可读性。对于您在列表上进行迭代的情况,for( a; b; c ) { d; }
是a; while( b ) { d; c; }
的简写。语言并不严格要求。拥有它的全部意义是暗示意图:“我想迭代整个列表”或“我想按顺序遍历列表的一部分,然后在我找到一些东西时中止”。
如果您添加额外的增量,这会让遇到您代码的其他人感到惊讶。如果您的c
上面说的是++x
或者其他什么,那么人们只会假设它会循环遍历所有项目,然后才会发现“惊喜!并非总是!”。
OTOH,如果你使用while循环,人们只会看到这个条件,并且会被警告这将是一个更复杂的循环,其中增量不会是恒定的。
Optimiziation。鉴于上述意图陈述,一些优化器将为for
语句生成与while
语句不同的代码。虽然它们都不会产生错误的代码,但它们可能会对非顺序访问应用的优化性能优于顺序访问。
并且“更差的性能特征”我的意思是他们可能会告诉CPU缓存错误的代码路径并将执行速度减慢一小部分周期,因为数据可能必须在被不必要地刷新后再次加载到CPU中