我们知道sizeof(int) = 4
和4 > -1
为真,因此以下代码的预期输出为真。
然而,它打印"错误"。为什么错了?
#include <stdio.h>
main(){
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
答案 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
进行比较后生成预期结果。