为什么此代码在C中返回false

时间:2014-04-11 14:22:48

标签: c

好的,试着理解为什么下面的if语句是假的。我把它翻了出去,无法理解这里发生了什么。

#define SIZE (sizeof(arr)/sizeof(int))

int main(int argc, char** argv)
{
    int arr[] = {1,2,3,4,5,6,7,8};

    if ( -1 <= SIZE )
        printf( "true" );
    else
        printf( "false" );

    return 0;

}

1 个答案:

答案 0 :(得分:12)

打印 false,因为比较中有符号/无符号不匹配。

sizeof的结果是size_t值,它是无符号的。将int-1与之进行比较时,整数将被解释为非常大的无符号值。

C99标准草案表达如下:

  

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

此处,size_t至少为unsigned int,使其排名等于或超出排名int,从而导致int转换为{{ 1}}。

另外,size_t确实会返回main(),我不明白为什么要对其进行编辑。