2016-08-05 4 views
1

以下のコードで、私はなぜ警告を受け取るのか不明です:反復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); 

} 
+2

未定義の動作により、動作が定義されず、何かが発生する可能性があります。 –

+5

'a [5]'にアクセスすると、物事がうまく行きます。 'for'ループの後に' i'の値は何ですか?したがって、whileループの最初の反復では、その値は何ですか?だからこそ、コンパイラは不平を言っています(なぜ 'i - 'が問題を解決するのか)。 –

+0

不確定な行為があった場合、私はあなたに同意します。しかしここで私が見る未定義の振る舞いは、whileループの中で[i]を初めて印刷するときです。しかし、そのような場合はごみが印刷されているようです。 forループはインデックスをインクリメントするためにのみ使用され、forループ内には何の問題もありません。なぜforループがループを指しているのですか? – Rajesh

答えて

4

は、私はちょうどジャンク結果を取得する必要があります。しかし、なぜ無限です!

forループが終了すると、値i5ある場合。

whileループの最初の反復では、a[5]にアクセスすると、未定義の動作につながります。その後、何かが起こる可能性があります。

また、whileループは別のアカウントで間違っています。未定義の動作がループで呼び出されなかった場合、tは54321、及び0に等しいiの値について、ループを6回実行されます。

whileループを入力する前にi--;を実行すると、両方の問題が修正されます。

+0

したがって、配列のインデックスが外れてしまった場合、それはジャンク値の印刷だけでなく、何らかの方法での不正行為でもあります。しかし、なぜコンパイル警告がforループを指しているのでしょうか? forループ内にprintf()ステートメントだけを追加すると警告が消えるのはなぜですか?したがって、コンパイラの動作も、未定義のランタイムに加えて未定義ですか? – Rajesh

+0

@Rajesh、最初の質問に「はい」。他の質問には答えがありません。 –

0

volatile iこのエラーメッセージを回避するのに役立ちます。

+0

こんにちは、サイトにようこそ! 'volatile'キーワードがこの問題を解決する理由を少し説明してください。 – GeorgDangl

関連する問題