1

让我们看下面的代码片段:

int i = 0;
while ( i <= 10 )
{
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }
    i++;
}

我必须在代码中进行哪些更改以避免无限循环?

4

4 回答 4

11

在开头而不是结尾做增量:

int i = -1;
while ( i <= 10 )
{
    i++;
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }

    // Presumably there would be some code here, or this doesn't really make much sense
}

或者,根据语言,您可以在语句中正确执行(无论您选择还是while记住运算符的优先级)i++++i

int i = 0
while ( i++ <= 10 )
{
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }

    // Presumably there would be some code here, or this doesn't really make much sense
}

不过,我会质疑while对这种结构使用循环。如果您想在循环中使用计数器,for循环通常更合适。

于 2013-01-17T19:35:26.903 回答
4

而不是一个快速修复解决方案,让我们看看你的代码一分钟,然后逐行浏览它:

int i = 0;
while ( i <= 10 )
{
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }
    i++;
}

i起初是 0,它小于 10,因此它进入循环,打印 0 并递增到 1。然后i变为 2、3、4、.. 8

当它等于 8 时,它不是递增,而是弹回到循环的开头,再次打印 8.. 检查i(即 8)的值并再次继续,打印 8.. 它将继续这样做直到永恒。

因此,在测试之前增加数字,它将按预期工作。

将您的代码更改为这样的内容

int i = 0;
while ( i <= 10 )
{
    if ( i != 8 )
    {
        System.out.println(i);
    }
    i++;
}
于 2013-01-17T19:38:49.037 回答
0

我喜欢 Eric Petroelje 的回答。我建议做这样的事情:

if (++i >= 8) continue;

此外,如今的编译器已经足以警告您这是一个可能的无限循环。还有一些代码分析工具也可以为您检测到这一点。

于 2013-01-17T20:01:23.013 回答
0

虽然这不是我在大多数情况下推荐使用的代码,但它确实起到了作用:

int i = 0;
while ( i <= 10 )
{
  Console.WriteLine(i.ToString());
  if ( i == 8 )
  {
    // Do some work here, then bail on this iteration.
    goto Continue;
  }

Continue:  // Yes, C# does support labels, using sparingly!
  i++;
}
于 2013-01-17T20:05:59.537 回答