40
#include <stdio.h>
int main(void)
{
    if (sizeof(int) > -1)
        printf("True");
    else
        printf("False");
}

印刷しFalseます。sizeof() が値を返さないのはなぜifですか?

4

5 に答える 5

55
  1. sizeof関数ではなく、演算子です。括弧はオペレーター名の一部ではありません。
  2. 生成された値が unsigned type であるため、失敗していますsize_t。これにより、unsigned に変換される「通常の算術変換」が発生-1します。この場合、非常に大きな数値になります。

基本的に、あなたは4 > 0xffffffffu、または少なくともそれに近いものを比較しています。詳細については、この質問を参照してください。

于 2013-06-25T09:32:02.747 に答える
24

符号なしおよび符号付き整数の昇格 (より正確には、「通常の算術変換」)。sizeoftype の値を生成size_tし、符号なしの値 (つまり) と比較するとsize_t、-1 がその型に昇格され、オーバーフローして巨大になります。

符号なし整数オーバーフローの動作は明確に定義されており、 modulo として解釈されます2 ^ width。ここwidthで、 は特定の符号なし整数型のビット数です。したがって、たとえば32 ビット幅のsize_tとがある場合、比較は次と同等になります。int

if (4 > 4294967295u)

これは明らかに誤りです。

于 2013-06-25T09:32:41.263 に答える