【问题标题】:How to exit from nested if-else statements inside a for loop?(C/C++) [closed]如何退出 for 循环内的嵌套 if-else 语句?(C/C++)[关闭]
【发布时间】:2018-05-15 18:17:19
【问题描述】:

我的程序中有一个for 循环,它是我的程序的主循环,它应该实时工作。循环内也有一些if-else 语句。我希望如果满足任何if 条件,程序退出if-else 语句并重试for 循环。

for(;;)
{
    if(condition_one)
    {
        do_one();
    }
    else if(condition_two)
    {
        do_two();
    }
    else 
    {
        do_three();
    }

    rest_of_program();
}

我试着把上面的代码写成这样:

for(;;)
{
    if(condition_one)
    {
        do_one();
        goto exitt; 
    }
    else if(condition_two)
    { 
        do_two();
        goto exitt;
    }
    else 
    {
        do_three(); 
    }
    exitt:
    rest_of_program();
}

但似乎有问题,我的程序无法运行!我做错什么了吗?还是有更好的主意?

【问题讨论】:

  • 您在寻找continuegotoreturn吗?有点难说..
  • not clear... “我希望如果每个 if 条件都满足,程序退出 if-else 语句并重试 for 循环。”您的第一个代码所做的是:无论满足什么条件,都会留下 if-else 语句,并且 for 循环会继续下一次迭代
  • 啊……你的意思是“如果满足任何个条件”?
  • 对不起,我会尝试编辑更清楚
  • 到目前为止,还不清楚为什么您需要 goto。在您的示例中,事情应该按照您发布的第一段代码中的方式进行。

标签: c++ for-loop break goto nested-if


【解决方案1】:

我认为你把事情复杂化了。问题是这段代码:

for(;;)
{
    if(condition_one)
    {
        do_one();
        goto exitt; 
    }
    else if(condition_two)
    { 
        do_two();
        goto exitt;
    }
    else 
    {
        do_three(); 
    }
    exitt:
    rest_of_program();
}

相当于这个:

for(;;)
{
    if(condition_one)
    {
        do_one();
    }
    else if(condition_two)
    { 
        do_two();
    }
    else 
    {
        do_three(); 
    }
    rest_of_program();
}

if-else的各个块是互斥的,无论执行哪一个,之后都会有rest_of_program,然后循环继续。

【讨论】:

  • 这是否回答了这个问题?我也有点困惑他在问什么,但我很确定他希望在两个 if 语句都得到满足的情况下返回 for 循环。
  • @CillianCollins 我正在尝试一种并行策略,要求在 cmets 中进行澄清,同时根据我目前的理解写一个答案,让我们看看这是怎么回事;)
  • 啊,够公平的。希望您在我们得到更多澄清时更新您的帖子!我以为你丢了它然后没有回答就离开了哈哈。
【解决方案2】:

【讨论】:

    【解决方案3】:

    由于没有提及,还可以选择使用continue 语句重置到循环的开始立即退出。请注意,此for 循环中执行迭代器语句。

    【讨论】:

      【解决方案4】:

      您不能尝试一个新的 IF 语句,并将其放在 for 循环的顶部吗?

      for(;;)
      {
      if(condition_one && condition_two){
          continue
      }
      else if(condition_one)
      {do_one();}
      else if(condition_two)
      {do_two();}
      else {do_three();}
      
      rest_of_program();
      }
      

      我认为这基本上就是您所要求的。您检查两者是否都满足,然后返回您的循环,否则您继续检查您的列表。

      顺便说一句,比使用 goto 更好的方法,但我没有看到你的完整代码,所以很难制定一个可行的解决方案。

      编辑:正如下面的 user463035818 所指出的,continue 将代替 goto。一开始我有点困惑,但他是对的,它会跳过当前的迭代。

      【讨论】:

      • 只需将continue 替换为goto
      • 他想重复forloop,而不是继续。如果他继续,那么他正在使用可以满足这两种条件的东西,并且可能会弄乱他的程序。他想重新启动程序,我想象当他回到它时,forloop 会改变。因为它是一个 forloop,所以它会有类似 '++' 的东西,每次迭代都会增加他的值。
      • 重复for(;;) 与“下一次”迭代中的continue 完全相同,这里真的不需要goto
      • 我不喜欢我的 OP 中提到的使用 goto 的做法,但我觉得信息太少,无法根据 OP 写的内容尝试替代解决方案,这是带有一堆 goto 的脚本。希望我们得到更多的说明以及更多的代码来做出您所做的假设。但我认为我们不能假设 continue 在这种情况下适合目的,可以吗?
      • 只是不要假设,而是按照OP发布的代码,其他的都是猜测
      猜你喜欢
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多