#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、または少なくともそれに近いものを比較しています。詳細については、この質問を参照してください。
符号なしおよび符号付き整数の昇格 (より正確には、「通常の算術変換」)。sizeoftype の値を生成size_tし、符号なしの値 (つまり) と比較するとsize_t、-1 がその型に昇格され、オーバーフローして巨大になります。
符号なし整数オーバーフローの動作は明確に定義されており、 modulo として解釈されます2 ^ width。ここwidthで、 は特定の符号なし整数型のビット数です。したがって、たとえば32 ビット幅のsize_tとがある場合、比較は次と同等になります。int
if (4 > 4294967295u)
これは明らかに誤りです。