#include <stdio.h>
int main(void)
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
印刷しFalse
ます。sizeof() が値を返さないのはなぜif
ですか?
sizeof
関数ではなく、演算子です。括弧はオペレーター名の一部ではありません。size_t
。これにより、unsigned に変換される「通常の算術変換」が発生-1
します。この場合、非常に大きな数値になります。基本的に、あなたは4 > 0xffffffffu
、または少なくともそれに近いものを比較しています。詳細については、この質問を参照してください。
符号なしおよび符号付き整数の昇格 (より正確には、「通常の算術変換」)。sizeof
type の値を生成size_t
し、符号なしの値 (つまり) と比較するとsize_t
、-1 がその型に昇格され、オーバーフローして巨大になります。
符号なし整数オーバーフローの動作は明確に定義されており、 modulo として解釈されます2 ^ width
。ここwidth
で、 は特定の符号なし整数型のビット数です。したがって、たとえば32 ビット幅のsize_t
とがある場合、比較は次と同等になります。int
if (4 > 4294967295u)
これは明らかに誤りです。