5

次のコードが警告しない理由を理解するのに苦労しています。

unsigned test = 0xffffffff;

for (unsigned char i = 0; i < test; i++)
{
    // Some code
}

これはVisualStudio2010にありますが、GCCも警告を表示しないようです。誰もが理由を知っていますか?

4

4 に答える 4

6

言語の観点から、警告することは何もありません。 評価される前ににi昇格されます。そして、ゼロにラップアラウンドするようにインクリメントすることは完全に明確に定義されています。unsigned int<unsigned char

このコードが何か苛立たしいことをするという事実は残念です。しかし、この種のものを検出するためにコンパイラがどのルールを適用する必要があるかは明確ではありません。

以下のコメントの@unwindに感謝します-Wtype-limits。フラグを使用して、この比較が常にtrueと評価される必要があるという事実についてGCCに警告させることができます。

アップデート2:この場合、上記のオプションは機能しないようです(現在、「最新」バージョンのGCCを入手できません...)

于 2013-03-21T10:50:54.190 に答える
1

iに昇格されunsigned、次にと比較されtestます。ここでは問題ありません。上手。i ++はcharをオーバーフローしますが、これは実行時の問題です。私が言いたいのは、255の後でそれは0になるということです、そしてそれはおそらく作者が考えているものではなく、それを終了する他の形式(休憩、復帰など)がなければサイクルを潜在的に無限にしますそれは可能性のある「論理的」です" ランタイムエラー。

于 2013-03-21T10:51:11.473 に答える
1

unsigned charとを比較することunsignedは完全に合法だからです。ループカウンターが明らかにオーバーフローしたために問題が発生し始めますが、コンパイラーがこれほど賢くなるかどうかはわかりませ

于 2013-03-21T10:53:35.640 に答える
1

ドラフト標準から:

4.5統合プロモーション

整数変換ランク(4.13)がintのランクよりも小さい、bool、char16_t、char32_t、またはwchar_t以外の整数型のprvalueは、intがソース型のすべての値を表すことができる場合、int型のprvalueに変換できます。 ; それ以外の場合は、ソースprvalueをunsignedint型のprvalueに変換できます。

于 2013-03-21T10:55:12.120 に答える