在下面的代码中,我不确定为什么会收到警告:当我评论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);
}
答案 0 :(得分:6)
如果索引超出范围,我应该只是将垃圾结果正确。但为什么无穷无尽!
当for
循环结束时,i
的值为5
。
在while
循环的第一次迭代中,您访问a[5]
,这会导致未定义的行为。在那之后,任何事情都可能发生。
另外,while
循环在另一个帐户上是错误的。如果未在循环中调用未定义的行为,则t将执行循环6
次,对于i
的值等于5
,4
,3
, 2
,1
和0
。
在进入i--;
循环之前执行while
可以解决这两个问题。
答案 1 :(得分:0)
volatile i
有助于避免此错误消息。