1

我有一个非常大的循环,可以循环 1000 行。如果找到魔法值 1,我将退出循环。如果没有找到魔法值 1 但找到了魔法值 2,则循环需要跳到开头。现在我正在使用一个开关,一些ifs和一个goto。我读过 goto 不是最好的方法。有没有更好的方法来完成这项工作?

4

7 回答 7

17

要退出循环,您可以使用break语句,要进入下一条记录,您可以使用continue语句。

for(int i = 0; i < 1000; i++)
{
    if(magicValue1)
       break;
    if(magicValue2)
       continue;
}

我不宽恕使用 GOTO 语句我只是指出一个可能的用例

您可以使用goto jump 语句来启动/退出循环,但是除非您使用嵌套循环,否则我会远离此选项。我认为 goto 语句仍然可以用于优化、干净退出等。但总的来说,最好谨慎使用

for(int i = 0; i < 100; i++)
{ 
  start:

  for(int i = 0; i < 10; i++)
  {
     if(magicValue1)
       goto end;
    if(magicValue2)
       goto start;
  }
}
end : 
于 2009-03-26T14:10:44.547 回答
10

这个怎么样:

for(int i = 0; i < 1000; i++) {
    if(values[i] == MAGIC_VALUE_1) {
        break;
    } else if(values[i] == MAGIC_VALUE_2) {
        i = 0;
    }
}

如果“跳到开头”是指“跳过这条记录并处理下一条”,请替换i = 0continue.

于 2009-03-26T14:11:45.573 回答
3

没有的while变体break

bool continue = true; int i = 0;
while (i < 1000 && continue){
    if(values[i] == MAGIC_VALUE_1) {
        continue=false;
    } else if(values[i] == MAGIC_VALUE_2) {
        i = 0;
    }
    i++;
}
于 2009-03-26T14:21:02.167 回答
2

我还不能发表评论(1个代表点)

但这不是更好吗:

for (int i = 0; i < 1000; i++)
{
    if (magicValue1)
    {
       break;
    }
    else if (magicValue2)
    {
       dosomething();
       i=0;
    }
}

而且我不确定“重新开始搜索”是什么意思。

于 2009-03-26T14:48:52.163 回答
1

我用#2 的情况表示你不想在#2 的情况下执行(即跳过)循环体,而不是你想将循环重置为 0。(如果我有,请参阅代码注释落后。)

这个建议可能会引起争议,因为 for 循环中不太常规的条件可以说在自我记录规模上很低,但如果这不打扰你,我认为你想要的一种简洁的写法是:

        for (int i= 0; i<values.Length && values[i]!= MAGIC_1; i++)
        {
            if (values[i] == MAGIC_2)
            {
                // Don't do the loop body for this case but continue on looping
                continue;
                // If you want to reset the loop to zero instead of skip the 2 case,
                // comment-out the continue; and un-comment the line below:
                // i=0;
            }
            // Do long loop body here
        }
于 2009-03-26T14:28:56.577 回答
1

请注意,如果在 MagicValue 为 2 时将计数器设置回 0,并且您的代码从不更改值,则您可能会处于无限循环中。

于 2009-03-26T15:29:03.503 回答
0

更复杂的可能是:

我们定义了 2 种扩展方法。

public static class Extensions
{
   public static bool isMagic_1(this int i)
   {
         return i == 1;
   }

   public static bool isMagic_2(this int i)
   {
         return i == 2;
   }
}

现在你可以这样做:

  for(int i = 0; i < 1000; i++)
  {
     if(i.isMagic_1())
       break;
     if(i.isMagic_2())
       continue;
  }

希望这可以帮助!

于 2009-03-26T17:03:35.273 回答