警告:迭代5u调用未定义的行为[-Waggressive-loop-optimizations]

时间:2016-08-05 05:34:11

标签: c mingw

在下面的代码中,我不确定为什么会收到警告:当我评论printf时,迭代5u会调用未定义的行为[-Waggressive-loop-optimizations](""); for循环中的语句。 printf语句如何导致此警告?。

其次,这段代码无限循环。进入while循环时,我知道数组索引超出限制。但是当我消极时,循环应该已经终止。但没有发生。如果i--在进入while循环之前完成,则没有问题。如果索引超出范围,我应该只是将垃圾结果正确。但为什么无穷无尽!

 int main (void)
{
   int a[]={4,6,8,2,7};
   int i=0;
   int size = sizeof(a)/sizeof(a[0]);

  for(i=0;i<size;i++)
   {
      // printf(" ");
   }
 // i--; // doing i-- works fine.
   while(i>=0)
    {
      printf("%d\t",a[i]);
      i--;
    }

  return(0);

}

2 个答案:

答案 0 :(得分:6)

  

如果索引超出范围,我应该只是将垃圾结果正确。但为什么无穷无尽!

for循环结束时,i的值为5

while循环的第一次迭代中,您访问a[5],这会导致未定义的行为。在那之后,任何事情都可能发生。

另外,while循环在另一个帐户上是错误的。如果未在循环中调用未定义的行为,则t将执行循环6次,对于i的值等于543210

在进入i--;循环之前执行while可以解决这两个问题。

答案 1 :(得分:0)

volatile i有助于避免此错误消息。