我目前在德国学习计算机科学,但之前做过几个C/C++开源项目。 今天我们在学校从 C 开始,我的老师说在循环中修改 for 循环变量是不行的,我完全同意。但是,我经常使用没有最后一个递增部分的 for 循环,然后只在循环内修改它,他也不喜欢。
所以基本上它归结为
for(int i=0; i<100;) {
[conditionally modify i]
}
与
int i=0;
while(i<100) {
[conditionally modify i]
}
我知道它们在编译后本质上是相同的,但我不喜欢使用 while 循环,因为:
- 通常的做法是将变量限制在尽可能小的范围内
- 如果您重用 i,它可能会引入错误(由于范围更大,您必须这样做)
- 如果不使用其他名称,则不能在以后的循环中对 i 使用不同的类型
有没有风格指南/常见做法选择哪一个?
如果你回答"我喜欢同时/更多",至少提供一个你这样做的理由。
我已经搜索了类似的问题,但是,我找不到这个案例的任何真正答案。
风格指南因人/团队而异。
C 标准是这样描述for
的语法的:
for
(
第1句;
表达式-2;
表达式-3)
语句
通常的做法是,一旦">条款-1"有效使用,就立即使用for
,这样做的原因确实是因为范围有限:
[...]如果条款 1是 声明,它声明的任何标识符的范围是声明的其余部分,并且 整个循环,包括其他两个表达式;[...]
所以,你的论证很好,你可以试着说服你的老师。但不要太努力。毕竟,风格问题很少有一个明确的答案,如果你的老师坚持他的规则,在为该课程编码时遵循它们。
程序员在决定使用哪个循环时遵循一些常见做法 -for
或while
!
当提前知道迭代次数时,for
循环似乎是最合适的。例如-
/*N - size of array*/
for (i = 0; i < N; i++) {
...
}
但是,可能存在许多复杂的问题,其中迭代次数取决于某个条件并且无法事先预测,在这些情况下while
循环更可取。 例如-
while( fgets( buf, MAXBUF, stdin ) != NULL)
但是,for
和while
环路都是入口控制的环路,并且可以互换。完全由程序员决定使用哪一个。
如果您要修改正文中的循环计数器,我建议不要使用for
循环,因为它比while
循环更容易引起读者的困惑。
您可以使用附加块来解决缺少范围限制的问题:
{
int i = 0;
while (i < 100) {
[conditionally modify i]
}
}
for(int i=0; i<100;) {
[conditionally modify i]
}
因为这看起来令人困惑,而不是编写循环的标准方法。此外,有条件地修改 i 是危险的,您不想这样做。阅读您的代码的人在理解您如何增加,为什么,何时增加时会遇到问题。等。您希望保持代码干净且易于理解。
我个人永远不会使用有条件修改迭代器来编写循环。如果需要,可以使用其他计数器或类似的东西。但是你不应该用条件迭代器来控制流程,有些人甚至避免休息并继续。