c语言if语句带sizeof
c language if statement with sizeof
#include <stdio.h>
main()
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
答案:
False
但根据逻辑 sizeof(int)
return 2 和 if(2>-1)
return 1 它应该打印 True.
为什么它的行为不一样?
首先,sizeof
产生的值是size_t
,也就是unsigned
类型。 注意
由于unsigned
类型比signed
类型具有更高的rank,在进行比较时,按照关系运算符的规范,执行通常的算术转换,这意味着有符号类型被提升为无符号类型。
在您的例子中,-1
当被视为 unsigned
时,代表可能的最高 unsigned
值,因此,难怪
if (sizeof(int) > -1)
计算结果为 false。
故事的寓意:signed
和 unsigned
之间的尝试比较 预期 会产生奇怪的结果,就像您的情况一样。您应该启用编译器警告并尝试解决编译器报告的问题。
注意:
来自 C11
,章节 §7.19,<stddef.h>
,
size_t
which is the unsigned
integer type of the result of the sizeof
operator.
sizeof
是returns大小和返回值类型为unsigned int
的运算符。
由于 unsigned
的等级高于 singed
类型,-1 被视为无符号数。
-1 在这种情况下被视为 0xFFFF。
因此 if (sizeof(int) > 0XFFFF)
被评估为 false
.
如果你写
if ( ( int )sizeof(int) > -1)
您将得到预期的结果,即 True
。
Operator sizeof returns 类型 size_t
对应于某些实现定义的无符号整数类型的值。
来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)
5 The value of the result of both operators is implementation-defined,
and its type (an unsigned integer type) is size_t, defined in (and other headers).
size_t
的等级在任何情况下都大于或至少等于类型 int
的等级。这意味着当编译器需要确定一个表达式的类型时,它转换操作数会将较低级别的操作数转换为较高级别的操作数的类型。如果操作数具有相同的等级但一个操作数是无符号整数类型而另一个操作数是有符号整数类型那么公共类型是无符号整数类型。
因此在if语句的条件下
if ( sizeof(int) > -1)
-1
被转换为无符号整数类型 size_t
并且由于其所有位都设置为 1 的内部表示形式比 sizeof( int )
的值更大
#include <stdio.h>
main()
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
答案:
False
但根据逻辑 sizeof(int)
return 2 和 if(2>-1)
return 1 它应该打印 True.
为什么它的行为不一样?
首先,sizeof
产生的值是size_t
,也就是unsigned
类型。 注意
由于unsigned
类型比signed
类型具有更高的rank,在进行比较时,按照关系运算符的规范,执行通常的算术转换,这意味着有符号类型被提升为无符号类型。
在您的例子中,-1
当被视为 unsigned
时,代表可能的最高 unsigned
值,因此,难怪
if (sizeof(int) > -1)
计算结果为 false。
故事的寓意:signed
和 unsigned
之间的尝试比较 预期 会产生奇怪的结果,就像您的情况一样。您应该启用编译器警告并尝试解决编译器报告的问题。
注意:
来自 C11
,章节 §7.19,<stddef.h>
,
size_t
which is theunsigned
integer type of the result of thesizeof
operator.
sizeof
是returns大小和返回值类型为unsigned int
的运算符。
由于 unsigned
的等级高于 singed
类型,-1 被视为无符号数。
-1 在这种情况下被视为 0xFFFF。
因此 if (sizeof(int) > 0XFFFF)
被评估为 false
.
如果你写
if ( ( int )sizeof(int) > -1)
您将得到预期的结果,即 True
。
Operator sizeof returns 类型 size_t
对应于某些实现定义的无符号整数类型的值。
来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)
5 The value of the result of both operators is implementation-defined, and its type (an unsigned integer type) is size_t, defined in (and other headers).
size_t
的等级在任何情况下都大于或至少等于类型 int
的等级。这意味着当编译器需要确定一个表达式的类型时,它转换操作数会将较低级别的操作数转换为较高级别的操作数的类型。如果操作数具有相同的等级但一个操作数是无符号整数类型而另一个操作数是有符号整数类型那么公共类型是无符号整数类型。
因此在if语句的条件下
if ( sizeof(int) > -1)
-1
被转换为无符号整数类型 size_t
并且由于其所有位都设置为 1 的内部表示形式比 sizeof( int )