当前位置:  开发笔记 > 编程语言 > 正文

如果达到了结束条件,是否可以在C++中退出for a before?

如何解决《如果达到了结束条件,是否可以在C++中退出forabefore?》经验,为你挑选了7个好方法。

我想知道当验证结束条件(不同于正确的迭代次数)时是否可以在C++中结束for循环.例如:

for (int i = 0; i < maxi; ++i)
    for (int j = 0; j < maxj; ++j)
        // But if i == 4 < maxi AND j == 3 < maxj, 
        // then jump out of the two nested loops.

我知道这可能在Perl中使用下一个LABEL或最后一个LABEL调用和标记的块,是否可以在C++中执行它或者我应该使用while循环?

谢谢.



1> ChrisW..:

您可以使用以下return关键字:将嵌套循环移动到子例程中,调用子例程以运行嵌套循环,并从子例程中"返回"以退出[all]循环.


@Chris每个控制流机制相当于一个goto.在硬件级别,除了goto之外别无他物.但是我们使用的控制流机制(for,while,if/else,return)具有限制,使得它们比gotos更有用.

2> D.Shawley..:

尽管有" goto被认为有害"的论点,但这似乎是一个完美的地方goto.这基本上就是你在Perl中所做的.认真地......考虑替代方案:

额外状态变量


for (int i=0; i

离开例外


try {
    for (int i=0; i

复杂的逻辑


int j = 0;
for (int i=0; i

goto


for (int i=0; i

最后一个不太明确吗?我不相信它.它更脆弱了吗?恕我直言,其他人相比goto版本更容易出错和脆弱.很抱歉在这里站在肥皂盒上但是这件事困扰了我一段时间;)

你必须要承认的唯一事情是,goto异常非常相似.它们都为泄漏资源提供了机会,并且不小心对待它们.



3> joel.neely..:

让我为重点(但礼貌地说,这;-),我可以:for在类似C语言的结构是不是计数.

确定是否继续的测试表达式可以是与循环目的相关的任何事物; 更新表达式不必是"向计数器添加一个".

for (int i = 0, j = 0; i < maxi && j < maxj && i != 4 && j != 3;) {
    if (j < maxj) {
        ++j;
    } else {
        j = 0;
        ++i;
    }
}

将是一种(相当随意的)重写方式.

关键是如果建立一些条件是一个交互的点,通常可以以更明确地陈述继续/终止条件的方式编写一个循环(使用while或者for).

(如果你可以发布实际发生的事情的描述,它可能会写出一些看起来不像上面任意的东西.)



4> Rob Walker..:

你不能用一个中断指令跳出两个循环,但是你可以使用goto从内部循环跳到外面.

如果goto是本地化的,并且意味着逻辑少于其他我认为它是完全可接受的代码.有额外的标志变量,或者从内循环中提取迭代器变量,这样你就可以在外循环中对它进行比较,这样就不会更容易理解代码恕我直言.



5> Daemin..:

从上面的所有建议中我将避免使用try/catch机制,因为异常应该保留用于特殊情况,而不是正常的控制流.

如果您可以适当地创建第二个条件,则使用两个中断是正常的.为此目的使用布尔值也很好,你甚至可以将它连接到每个for循环的条件.例如:

bool exit_loops = false;
for (int a = 0; a < A && !exit_loops; ++a)
{
    for (int b = 0; b < B && !exit_loops; ++b)
    {
        if (some_condition) exit_loops = true;
    }
}

虽然如果你使用两个以上的循环,将它们包装在一个函数中可能更合适,只需使用return退出函数(以及所有的循环).然后,您可以通过调用函数执行内部循环代码等方式来重构代码,从而可以消除除一个循环之外的所有循环.

最后不要害怕在这种情况下使用goto,通常goto是非常糟糕的非结构化编程,但在某些情况下(像这样)它们非常有用.



6> Skizz..:

你不能在C/C++中跳出这样的:

for (...)
{
  for (...)
  {
    // from here...
  }
}
// ...to here

没有使用goto.你需要一个像这样的结构:

for (...)
{
  bool
    exit = false;

  for (...)
  {
    if (do_exit)
    {
      exit = true; // or set outer loop counter to end value
      break;
    }
  }
  if (exit)
  {
    break;
  }
}

或者,使用throw和catch - 但这并不好,因为throw应该用于异常而不是流控制.

一个干净的方法是使内循环成为一个函数:

bool F ()
{
  if inner loop terminates, return false else return true
}

void G ()
{
  for (...)
  {
    if (!F ())
    {
      break;
    }
  }
}



7> Gilad Naor..:
bool done = false;

for (int i = 0; i < maxi && !done; ++i)
    for (int j = 0; j < maxj && !done; ++j)
        if (i == 4 && i < maxi && j == 3 && j < maxj )
             done = true;
        else {
        }

或者你可以转到.或不 :-)

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有