【问题标题】:C++ What is the "best" way to stop a for loop?C++ 停止 for 循环的“最佳”方法是什么?
【发布时间】:2016-11-05 04:06:10
【问题描述】:

假设您想在 C++ 中创建一个 for 循环,但除了确定的条件之外,您还知道循环何时或是否应该停止。请注意,这样的条件不一定必须是硬编码的,循环也不应该一直具有这样的确定值。这只是一个示例,可能对随机循环有用,或者内容是在运行时确定的。让我们让这个示例保持简单,并专注于一个可以应用于编程中任何此类相关任务的解决方案。

我想比较这两种解决方案。第一个使用中断语句,第二个使用多个或组合条件。就效率或可靠性而言,哪一种是完成任务的“最佳”或“正确”方式。哪一个更不容易出错?欢迎提出其他解决方案。

const int MAX_SIZE = 10;
int myArray[MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// two ways to stop a loop

for (int x = 0; x <  MAX_SIZE; x++) {
   if (myArray[x] == 7) {
      break;
   }
   cout << myArray[x] << “ “; // fixed
}

for (int x = 0; (x < MAX_SIZE) && (myArray[x] != 7); x++) {
   cout << myArray[x] << “ “;
}

【问题讨论】:

  • 我会选择第二种形式,因为它将条件保存在一个地方,并且实际的循环代码没有不相关的部分。我认为这取决于偏好。
  • 似乎你的循环有不同的行为。假设 x 为 0,myArray[0] 等于 7。
  • 我的意思是你在这两种情况下每次都进行相同数量的比较。我认为第一个条件更具可读性,因为任何人都可以忽略标准的for 循环代码,并将第二个条件视为特殊情况。老实说,我认为这只是微不足道的。
  • 为了解决不同的行为,或者你在第一个 while 到最后(在 if 之后)更改 cout 或者代替 last for,将其更改为 do { } while (),假设 MAX_SIZE 始终开始大于x

标签: c++ for-loop break


【解决方案1】:

首先,循环的行为明显不同 - 第一个仍然打印数字 7 而另一个则没有。

如果你换行了,这对编译器来说并没有什么不同,两种解决方案都可以用几乎相同的本机代码编译。

关于可读性(并且容易出错):这取决于,对于这样简单的规则,将其作为条件的一部分可能会更好、更易读。但是当它变得更复杂时,可能值得引入一些临时变量,然后break 变体更易于阅读。实际上,更复杂的算法在循环中使用break 是很常见的,通常甚至是在内部使用break 的无限循环。

【讨论】:

    【解决方案2】:

    正如其他人也指出的那样,这两种方法并不等效,因为一种产生的输出比另一种多。但是,我想这只是一个错字,您可以通过运行代码肯定地识别出来。

    出于比较的目的,第一个更容易概括,以防您需要使用更多的停止条件(它比使用很长的 if 更具可读性)或在停止循环之前执行其他操作。例如,您可能想先检查是否myArray[x] == 7,然后在中断循环之前输出一些内容,这可能是这样做的原因。因此,当您的代码复杂时,第一种方法更好。

    在性能方面,这些方法非常相似。

    【讨论】:

      【解决方案3】:

      这两个循环不等价。要使第一个循环产生与第二个循环相同的输出(至少,对于您指定的数组的内容),您需要将其更改为

      for (int x = 0; x <  MAX_SIZE; x++)
      {
           if (myArray[x] == 7)
           {
              break;
           }
           cout << myArray[x] << " ";
      }
      

      实际上,大多数人会发现您的第二种形式更具可读性,因为有一个明显的条件可以结束循环,而不是两个单独的地方可以终止循环。这是我通常会使用的。

      您认为您拥有的表单是等效的这一事实表明可读性问题正在影响您。所以第二种形式肯定更可取。

      【讨论】:

      • 谢谢。这种形式的循环才是我真正的意思。
      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2019-09-06
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多