看看C ++中是否会出现无限循环

时间:2009-09-14 17:57:07

标签: c++ infinite-loop

以下代码会导致无限循环吗?

  x=0;
  y=0;

  while(x<100)
  {
    minnum=100;
    maxnum=100;
    while(y<150)
    {
    if(random[x][y]<minnum)
      {
      minnum=random[x][y];
      minX=x;
      minY=y;
      y++;
      }
    else if(random[x][y]>maxnum)
      {
      maxnum=random[x][y];
      maxX=y;
      maxY=y;
      y++;
      }
    }
    x++;
    y=0;
  }  

11 个答案:

答案 0 :(得分:9)

如果random[x][y]<minnumrandom[x][y]>maxnum都是false,那么您永远不会退出内循环。更具体地说,如果random[x][y] == 100你第一次举杯祝酒。

作为一个相关问题,您在调试已发布的源时会看到什么行为?

答案 1 :(得分:2)

原始问题有很多好的答案,但即便如此,它们都不会起作用!那是因为在第二个“if”区块中有一个尽职尽责的错字 - 应该阅读

maxX = x; // not y!
maxY = y;

答案 2 :(得分:1)

如果内循环中的ifelse if都不满足,则永远不会增加y,从而使内循环不变。看起来y++应该在任何条件语句之外。

答案 3 :(得分:1)

只要数组值介于minnum和maxnum之间,就会进入无限循环。最初,这只是在100.第二次传递,是您看到的最小值和最大值之间的差异。例如,如果值为3000,则minnum为100,maxnum为3000.现在,100到3000之间的任何数字(包括100和3000)都将导致无限循环。请参阅其他答案以了解如何修复代码。

雅各

答案 4 :(得分:0)

在内部while循环中,如果random[x][y] == minnum,则y永远不会递增,程序将进入无限循环。

答案 5 :(得分:0)

如果minnum <= random[x][y] <= maxnum,那么y永远不会在内循环中递增。在任何情况下你都应该增加y,即使没有满足if条件。最好在y++循环的右大括号之前移动if之外的while

您还可以使用for - 循环来迭代xy的可能值,这样可以降低出现此类错误的可能性。

答案 6 :(得分:0)

如果random[x][y]正好是100,那么这将无限循环,因为在这种情况下它永远不会做任何事情。

答案 7 :(得分:0)

这是我对这个循环的看法 - 关于如何编写“好”代码的一些概念(从我的观点来看 - 我真的不是编程中的大师) - 不是必须遵循它们,但我认为它们是不是那么糟糕。

  // It's a good rule - to initialize minimum and maximum with one
  // (any) element from the array you will be working with
  minnum=random[0][0];
  maxnum=random[0][0];

  // This is my hamble opinion but I'll prefer to have variables for array sizes
  sizeX=100;
  sizeY=150;

  // Cannot you use for instead of while?
  for(x = 0; x < sizeX; ++x)
      for(y = 0; y < sizeY; ++y)
      {
          if(random[x][y] < minnum)
          {
              minnum = random[x][y];
              minX = x;
              minY = y;
          }
          else if(random[x][y] > maxnum)
          {
              maxnum = random[x][y];
              maxX = x;
              maxY = y;
          }
    }

答案 8 :(得分:0)

问题在于,当随机小于minnum或大于maxnum时,你只会提升y,从而产生一个既不会发生的问题。

但是,为什么只有在出现这些情况时才推广它? 无论这些条件如何,你都希望升职。

您可能想要更改为:

while(y<150)
{
if(random[x][y]<minnum)
  {
  minnum=random[x][y];
  minX=x;
  minY=y;
  }
else if(random[x][y]>maxnum)
  {
  maxnum=random[x][y];
  maxX=y;
  maxY=y;
  }
  y++;
}

这样,y和x都会被提升。

答案 9 :(得分:0)

如果您将循环替换为 for 循环,那么您的代码将更有意义,更不容易出错,这将解决您的无限循环问题:< / p>

minnum=100;
maxnum=100;
for (int x = 0; x<100; x++)
{
  for(int y=0; y<150; y++)
  {
    if(random[x][y]<minnum)
    {
      minnum=random[x][y];
      minX=x;
      minY=y;
    }
    else if(random[x][y]>maxnum)
    {
      maxnum=random[x][y];
      maxX=y;
      maxY=y;
    }
  }
}

答案 10 :(得分:0)

我想知道现在大学的教授是否应该知道学生可以这样上网并获得答案?

无论如何,如果每个人都在说随机[x] [y] == 100,那么这将始终在内循环中。