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

故事的寓意:signedunsigned 之间的尝试比较 预期 会产生奇怪的结果,就像您的情况一样。您应该启用编译器警告并尝试解决编译器报告的问题。


注意:

来自 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 )

的值更大