次のコードが警告しない理由を理解するのに苦労しています。
unsigned test = 0xffffffff;
for (unsigned char i = 0; i < test; i++)
{
// Some code
}
これはVisualStudio2010にありますが、GCCも警告を表示しないようです。誰もが理由を知っていますか?
次のコードが警告しない理由を理解するのに苦労しています。
unsigned test = 0xffffffff;
for (unsigned char i = 0; i < test; i++)
{
// Some code
}
これはVisualStudio2010にありますが、GCCも警告を表示しないようです。誰もが理由を知っていますか?
言語の観点から、警告することは何もありません。 評価される前ににi
昇格されます。そして、ゼロにラップアラウンドするようにインクリメントすることは完全に明確に定義されています。unsigned int
<
unsigned char
このコードが何か苛立たしいことをするという事実は残念です。しかし、この種のものを検出するためにコンパイラがどのルールを適用する必要があるかは明確ではありません。
以下のコメントの@unwindに感謝します-Wtype-limits
。フラグを使用して、この比較が常にtrueと評価される必要があるという事実についてGCCに警告させることができます。
アップデート2:この場合、上記のオプションは機能しないようです(現在、「最新」バージョンのGCCを入手できません...)
i
に昇格されunsigned
、次にと比較されtest
ます。ここでは問題ありません。上手。i ++はcharをオーバーフローしますが、これは実行時の問題です。私が言いたいのは、255の後でそれは0になるということです、そしてそれはおそらく作者が考えているものではなく、それを終了する他の形式(休憩、復帰など)がなければサイクルを潜在的に無限にしますそれは可能性のある「論理的」です" ランタイムエラー。
unsigned char
とを比較することunsigned
は完全に合法だからです。ループカウンターが明らかにオーバーフローしたために問題が発生し始めますが、コンパイラーがこれほど賢くなるかどうかはわかりません。
ドラフト標準から:
4.5統合プロモーション
整数変換ランク(4.13)がintのランクよりも小さい、bool、char16_t、char32_t、またはwchar_t以外の整数型のprvalueは、intがソース型のすべての値を表すことができる場合、int型のprvalueに変換できます。 ; それ以外の場合は、ソースprvalueをunsignedint型のprvalueに変換できます。