【问题标题】:Is it bad to have a for loop without an increment or decrement?没有递增或递减的 for 循环是不是很糟糕?
【发布时间】:2017-04-08 07:55:03
【问题描述】:

有时我需要在 C/C++ 中编写一个循环,其中有一个初始化,然后是一个条件。

我喜欢这个样子,

for (int i = 0, j = 0; i == 0 && j == 0;) {
    // condition fails at some point
}

不止于此。

int i = 0, j = 0;
while (i == 0 && j == 0) {
    // condition fails at some point
}

当然,这是个人代码,所以没有人可以评判我。编译器会让它们成为同一个东西吗?

【问题讨论】:

  • 变量作用域不同。
  • 我假设 i 和 j 只能在 for 循环中使用;那对我来说没问题。
  • 它当然可以生成同义代码。例如,for-loopwhile-loop。这并不意味着编译器必须生成相同的代码。您始终可以通过使用两者来检查自己,然后拆卸和比较。

标签: c++ c for-loop


【解决方案1】:

如果您不需要循环后的变量ij,请使用for 循环。

如果您需要循环后的变量ij,请使用while 循环。

【讨论】:

  • 您可以在for之外声明和定义ij
  • @Igor。是的,一个人可以做到这一点。但是,对于这样的用例,for 循环的附加句法元素根本没有用处。 while 循环会更干净。
【解决方案2】:

如果您不使用 for 循环中的第三个子句(用于递增/递减/任何内容),则您无需为此付费。

编译器完全能够在这两种情况下生成相同的代码,因此您的 for 代码是有效的,并且可能由于其他人提出的范围参数而更可取。

实际上C++标准explicitly requires这两个选项是等价的,所以这甚至不是编译器的选择问题。

【讨论】:

    【解决方案3】:

    没有好坏之分。

    正如 BLUEPIXY 的评论和 R Sahu 的回答中所指出的那样,变量的范围是不同的。 while 形式允许在循环之后使用变量 ij,而 for 形式不允许使用(尽管可以通过在 for 语句之前声明变量来轻松更改) .

    只有您可以决定是否需要在循环后访问变量 i 和/或 j。但是,根据经验,我建议不要在循环之后访问它们,除非有特定需要(即尽可能限制它们的范围)。

    如果这段代码在自己的函数中,并且函数在循环后立即返回,那么只有函数的返回值取决于ij时才有区别。

    您可能想仔细查看变量ij 在循环体内是如何更新的,并考虑是否可以将该逻辑移至for 语句本身。根据循环体的复杂性,这可能会也可能不会。这可以帮助读者更清楚地了解循环实际更新这些变量的条件。并且考虑是否将更新移到循环体之外将迫使您考虑循环体本身是否可以以更简单的方式编写(如果在两种方式之间进行选择以达到相同的结果,总是更喜欢更简单的方式,因为它更容易更容易理解、更容易正确、更容易在未来维护)。

    假设您有一个依赖于两个变量值的循环,请考虑嵌套循环(一个在i 上工作,一个在j 上工作)是否可行。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2014-02-03
      • 2020-03-06
      • 1970-01-01
      • 2011-10-15
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多