为什么这个C编程代码输出是假的?预期产出是真实的

时间:2015-03-08 16:02:15

标签: c if-statement sizeof

我们知道sizeof(int) = 44 > -1为真,因此以下代码的预期输出为真。

然而,它打印"错误"。为什么错了?

#include <stdio.h>

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

5 个答案:

答案 0 :(得分:3)

sizeof返回size_t类型的unsigned类型。 -1属于signed类型,在比较之前添加unsigned会隐式转换为UINT_MAX类型。

答案 1 :(得分:3)

sizeof会返回unsigned int。 -1施放到unsigned int最终会成为一个相当大的数字。

答案 2 :(得分:2)

if(sizeof(int) > -1)

原因是sizeof返回(无符号)值,因此-1在比较之前被转换为unsigned。

标准说:

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

请注意,如果第二个操作数的排名更高,则结果会有所不同。我的编译器很长时间都是真的:

if (sizeof(int) > -1LL)

答案 3 :(得分:1)

运算符sizeof返回一个具有typedef名称size_t的无符号整数类型的值。例如,它可以是unsigned long但无论如何,size_t的等级不低于int的等级。

根据通常的aruthmetic转换规则(C标准​​,6.3.1.8常规算术转换)

  

否则,如果具有无符号整数类型的操作数具有等级   那么,大于或等于另一个操作数的类型的等级   带有符号整数类型的操作数转换为   具有无符号整数类型的操作数。

所以在if语句的表达式中

if (sizeof(int) > -1)

类型为-1的整数常量int将转换为size_t类型且值为SIZE_MAX

SIZE_MAX大于4(或与sizeof运算符返回的其他对应于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

答案 4 :(得分:1)

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

现在,如果您if ((int)sizeof(int) > -1)int的大小转换为有符号整数,并与-1进行比较后生成预期结果。