【问题标题】:for without increment vs whilefor 无增量 vs while
【发布时间】:2017-10-17 09:57:17
【问题描述】:

我目前在德国学习计算机科学,但之前曾参与过几个 C/C++ 开源项目。 今天我们在学校从 C 开始,我的老师说在循环中修改 for 循环变量是不行的,我完全同意。但是,我经常使用没有最后递增部分的 for 循环,然后在循环内仅对其进行修改,这也是他不喜欢的。

所以基本上归结为

for(int i=0; i<100;) {
    [conditionally modify i]
}

对

int i=0;
while(i<100) {
    [conditionally modify i]
}

我知道它们在编译后本质上是一样的,但我不喜欢使用 while 循环,因为:

  1. 通常的做法是将变量限制在尽可能小的范围内
  2. 如果您重用 i 可能会引入错误(因为范围较大,您必须这样做)
  3. 如果不使用不同的名称,您不能在以后的循环中为 i 使用不同的类型

是否有任何样式指南/常见做法可供选择?

如果您回答“我喜欢一段时间/更多”,请至少说明您这样做的原因。

我确实已经搜索过类似的问题,但是,我找不到这个案例的任何真正答案。

【问题讨论】:

  • 对于使用 for 循环没有“硬性规定”。如果您需要它,请使用它。不过,请检查是否有一些标准库方法的算法首先解决了潜在问题。 (这里主要从 C++ 迭代器循环 POV 说起,该标签已被删除。)
  • smh 我不喜欢[conditionally modify i] 部分。如果条件从未满足怎么办?
  • “我的老师说在循环中修改 for 循环变量是不行的,我绝对同意”:你问你的老师他为什么这么认为所以?你为什么同意他的观点?
  • @Techy 为什么要为一个 C 问题标记一个 java 骗子?
  • 至少您没有要求我们在while(1) 和for(;;) 之间进行选择。然后你就会有一场真正的火焰战争。

标签: c loops styles


【解决方案1】:

风格指南因人/团队而异。

C 标准这样描述for 的语法:

for ( clause-1 ; expression-2 ; expression-3 ) 声明

通常的做法是使用for一旦您对“clause-1”有有效用途,这样做的原因是确实因为范围有限:

[...] 如果 clause-1 是 声明,它声明的任何标识符的范围是声明的其余部分,并且 整个循环,包括其他两个表达式; [...]

所以,你的论点很好,你可以尝试说服你的老师。但不要太努力。毕竟,风格问题很少有一个确定的答案,如果你的老师坚持他的规则,那么在为这门课编码时就遵循它们。

【讨论】:

  • 我要补充一点,如果您以编写代码为生,您可能会根据样式指南工作,这些指南指定了编写此类循环的不同方法。
【解决方案2】:

程序员在决定使用哪个循环时遵循一些常见做法 - for 或 while!

当事先知道迭代次数时,for 循环似乎最合适。比如——

/*N - size of array*/
for (i = 0; i < N; i++) {
  ...
}

但是,可能存在许多复杂问题,其中迭代次数取决于特定条件并且无法事先预测,在这些情况下,while 循环更可取。 比如——

while( fgets( buf, MAXBUF, stdin ) != NULL)

但是,for 和 while 循环都是入口控制循环,并且可以互换。完全由程序员决定使用哪一个。

【讨论】:

    【解决方案3】:

    如果您要修改正文中的循环计数器,我建议不要使用for 循环,因为它比while 循环更容易引起读者的困惑。

    您可以通过附加块来解决缺少范围限制的问题:

    {
        int i = 0;
        while (i < 100) {
            [conditionally modify i]
        }
    }
    

    【讨论】:

      【解决方案4】:
          for(int i=0; i<100;) {
      [conditionally modify i]
      }
      

      因为这看起来令人困惑,而不是编写 for 循环的标准方式。此外,有条件地修改 i 是危险的,你不想这样做。阅读您的代码的人会难以理解您如何增加、为什么、何时......等等。您希望保持代码简洁易懂。

      我个人永远不会编写带有条件修改迭代器的 for 循环。如果你需要它,你可以使用额外的计数器,或者类似的东西。但是您不应该使用条件迭代器来控制流程,有些人甚至避免中断并继续。

      【讨论】:

      • 我不会投反对票,但我不同意。虽然条件修改有点难看,但并不危险。在某些情况下,它是必要的,或者至少比替代方案更具可读性。
      • 也许有时,但他一般都会问这个问题,对吧?想象一下阅读某人的代码,并且对于每个循环,您需要推断它是如何递增的。而且我只是不喜欢通过玩迭代器来控制循环流,我认为有更好的方法来做到这一点。
      • 我同意你的解释,但这是while 循环的论据,而不是for 循环。
      猜你喜欢
      • 2011-05-20
      • 2023-03-17
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2013-02-16
      • 2011-02-26
      • 2013-09-09
      相关资源
      最近更新 更多