以下のコードで、私はなぜ警告を受け取るのか不明です:反復5uは定義されていない動作[-Waggressive-loop-optimizations] printf( ""); forループのステートメントprintf文がこの警告にどのように寄与していますか?警告:反復5uは未定義の動作を引き起こす[-Waggressive-loop-optimizations]
第2に、このコードは無限ループになります。私はwhileループに入るときに配列インデックスが限界を超えていることを知っています。しかし、私が負になると、ループは終了しているはずです。しかし、起こっていない。ループ中に入る前にi--が完了しても問題はありません。インデックスが範囲外の場合、私はちょうど迷惑な結果を取得する必要があります。しかし、なぜ無限です!インデックスがバウンド外の場合
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);
}
未定義の動作により、動作が定義されず、何かが発生する可能性があります。 –
'a [5]'にアクセスすると、物事がうまく行きます。 'for'ループの後に' i'の値は何ですか?したがって、whileループの最初の反復では、その値は何ですか?だからこそ、コンパイラは不平を言っています(なぜ 'i - 'が問題を解決するのか)。 –
不確定な行為があった場合、私はあなたに同意します。しかしここで私が見る未定義の振る舞いは、whileループの中で[i]を初めて印刷するときです。しかし、そのような場合はごみが印刷されているようです。 forループはインデックスをインクリメントするためにのみ使用され、forループ内には何の問題もありません。なぜforループがループを指しているのですか? – Rajesh