好的,试着理解为什么下面的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;
}
答案 0 :(得分:12)
打印 false
,因为比较中有符号/无符号不匹配。
sizeof
的结果是size_t
值,它是无符号的。将int
值-1
与之进行比较时,整数将被解释为非常大的无符号值。
C99标准草案表达如下:
否则,如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 有符号整数类型转换为带有unsigned的操作数的类型 整数类型。
此处,size_t
至少为unsigned int
,使其排名等于或超出排名int
,从而导致int
转换为{{ 1}}。
另外,size_t
确实会返回main()
,我不明白为什么要对其进行编辑。