为什么此 C 程序代码输出为 False?预期输出为真
Why this C programming code output is False? expected output is true
我们知道 sizeof(int) = 4
和 4 > -1
是真的,所以下面这段代码的预期输出是真的。
但是,它正在打印 "False"。为什么错了?
#include <stdio.h>
main(){
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
sizeof
returns size_t
类型是 unsigned
类型。 -1
是signed
类型,比较前加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
.
比较时产生预期的结果
我们知道 sizeof(int) = 4
和 4 > -1
是真的,所以下面这段代码的预期输出是真的。
但是,它正在打印 "False"。为什么错了?
#include <stdio.h>
main(){
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
sizeof
returns size_t
类型是 unsigned
类型。 -1
是signed
类型,比较前加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
.