为什么此 C 程序代码输出为 False?预期输出为真

Why this C programming code output is False? expected output is true

我们知道 sizeof(int) = 44 > -1 是真的,所以下面这段代码的预期输出是真的。

但是,它正在打印 "False"。为什么错了?

#include <stdio.h>

main(){
    if (sizeof(int) > -1)
        printf("True");
    else
        printf("False");
}

sizeof returns size_t 类型是 unsigned 类型。 -1signed类型,比较前加UINT_MAX隐式转换成unsigned类型。

sizeof returns 一个 unsigned int。 -1 转换为 unsigned int 最终是一个相当大的数字。

if(sizeof(int) > -1)

原因是 sizeof returns (unsigned) 值,所以 -1 在比较之前被转换为 unsigned。

标准说:

如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将带符号整数类型的操作数转换为无符号整数类型的操作数的类型。

请注意,如果第二个操作数的秩更大,则结果不同。我的编译器给出 true for long long:

if (sizeof(int) > -1LL)

运算符 sizeof returns 一些具有 typedef 名称 size_t 的无符号整数类型的值。例如可以是 unsigned long 但无论如何 size_t 的排名不低于 int.

的排名

根据常用算术转换规则(C 标准,6.3.1.8 常用算术转换)

Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.

所以在 if 语句的这个表达式中

if (sizeof(int) > -1)

类型为 int 的整数常量 -1 被转换为类型 size_t 并具有值 SIZE_MAX.

SIZE_MAX 大于 sizeof 运算符返回的 4(或对应于 sizeof( int ) 的其他值)。 因此上面的语句可以改写成

if (sizeof(int) > SIZE_MAX)

它产生 false.

请注意,如果整数常量的秩大于 size_t 的秩,则可以阻止整数常量的转换。 例如尝试下面的 if 语句

if (sizeof(int) > -1ll)

在这种情况下,如果 size_t 没有像 unsigned long long 那样定义,那么表达式的计算结果将如您预期的那样等于 true

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    if ( sizeof( int ) > -1 )
    {
        puts( "True" );
    }       
    else
    {
        puts( "False" );
    }

    if ( sizeof( int ) > -1ll )
    {
        puts( "True" );
    }       
    else
    {
        puts( "False" );
    }

    return 0;
}

它的输出是

False
True

将无符号整数与有符号整数进行比较会将有符号整数转换为无符号整数,从而产生垃圾值,该值恰好大于 int 的大小。

现在,如果您 if ((int)sizeof(int) > -1) 会将 int 的大小转换为有符号整数,并在与 -1.

比较时产生预期的结果