【问题标题】:C multi-loop for() basicsC 多循环 for() 基础知识
【发布时间】:2016-04-27 19:59:07
【问题描述】:

如何在没有 goto 和额外过程调用的情况下编写示例代码?

for(i=0;i<imax;i++)
{   for(j=0;j<jmax(i);j++)
    {   for(c=0;c<cmax(j);c++)
        {   if(!check1(c))
            {    if(check2()) goto ni;
                 else goto nj;
            }
        }
    // **EDIT** procedure call is here
nj:;
    }
ni:;
}

【问题讨论】:

  • 使用break 而不是goto ?
  • 状态机设计?在每个循环上实现状态并检查使用 continue(s) 和/或 break(s)
  • 使嵌套循环中的所有条件为假(根据您要跳出的数字),然后从最里面的循环中跳出。在此处检查后您没有代码,但请注意,“父”循环中的任何代码都将在中断前再执行一次。
  • 顺便说一句,goto 本身并没有什么问题,在大多数情况下它只会导致代码极其混乱,但你不必为了避免goto 而编写混乱的代码
  • 跳出嵌套循环是goto 是最干净的解决方案的其余情况之一。

标签: c++ c for-loop


【解决方案1】:

检查此代码:

    bool flag = false;
    for(i=0;i<imax;i++)
    {   for(j=0;j<jmax(i);j++)
        {   for(c=0;c<cmax(j);c++)
            {   if(!check1(c))
                {    if(check2()) {flag=true;break;}// goes to ni
                     else break; //goes to nj
                }
            }
            if(flag){flag=false; break;}
            nj:;
        }
        // procedure
    ni:;
    }

【讨论】:

    【解决方案2】:

    goto nj 可以替换为break。但是,如果您需要跳出嵌套循环,break 将无法帮助您。我认为这是goto 的一个完全合法的用例。我能想到的唯一选择是将循环计数器设置在其范围之外,例如c = cmax(j)。在我看来,比goto 更糟糕。

    【讨论】:

    • 我不太同意“break cant help”的说法。他可以使用一个标志来将中断转发到外部循环。这是否比goto 更好是另一个问题。
    • 我不太同意“break can't help”或“break can help”。也许这也是措辞和实用主义的问题。我敢说我已经看到使用goto 打破多个嵌套循环的良好编程实践示例,这可能是我也在C 中使用goto 的两种情况之一。虽然我理解这不能回答问题是,只要可以通过声明、设置、检查和重置其他变量、标志等来实现目标而不会使代码负担过重,就使用break 是最好的解决方案。
    猜你喜欢
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2018-05-25
    • 2014-11-28
    • 2014-02-14
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多