带有sizeof的c语言if语句 #包括 main() { if(sizeof(int)>-1) printf(“真实”); 其他的 printf(“假”); }

带有sizeof的c语言if语句 #包括 main() { if(sizeof(int)>-1) printf(“真实”); 其他的 printf(“假”); },c,if-statement,sizeof,C,If Statement,Sizeof,答复: 假的 但是根据逻辑sizeof(int)返回2和if(2>-1)返回1,它应该打印为True 为什么它的行为不是这样?首先,由sizeof产生的值是size\u t类型,即无符号类型。注 由于无符号类型的秩高于有符号类型,因此在执行比较时,根据关系运算符的规范,将执行通常的算术转换,这意味着将有符号类型提升为无符号类型 在您的例子中,-1,当被视为无符号时,代表可能的最高值无符号,因此,这也就不足为奇了 #include <stdio.h> main() { if (s

答复:

假的

但是根据逻辑
sizeof(int)
返回2和
if(2>-1)
返回1,它应该打印为True


为什么它的行为不是这样?

首先,由
sizeof
产生的值是
size\u t
类型,即
无符号类型。注

由于
无符号
类型的秩高于
有符号
类型,因此在执行比较时,根据关系运算符的规范,将执行通常的算术转换,这意味着将有符号类型提升为无符号类型

在您的例子中,
-1
,当被视为
无符号
时,代表可能的最高值
无符号
,因此,这也就不足为奇了

#include <stdio.h>
main()
{
   if (sizeof(int) > -1)
       printf("True");
   else
       printf("False");
}
计算结果为false

这个故事的寓意是:尝试比较有符号的
和无符号的会产生奇怪的结果,就像你的例子一样。您应该启用编译器警告,并尝试解决编译器报告的问题


注:

来自
C11
,第§7.19章,

size\u t

它是
sizeof
运算符结果的
无符号
整数类型


sizeof
是一个返回大小的运算符,返回的值类型为
unsigned int
。 由于
无符号
的秩高于
有符号
类型,因此,-1被视为无符号数。 -在这种情况下,1被视为0xFFFF。 因此
if(sizeof(int)>0XFFFF)
的计算结果为
false

如果你写

 if (sizeof(int) > -1)
您将得到
为真的预期结果

运算符sizeof返回类型为
size\t
的值,该值对应于某个实现定义的无符号整数类型

来自C标准(6.5.3.4操作员的尺寸和校准)

5两个运算符的结果值都是实现定义的, 及其类型(无符号整数类型)是在(和其他标题)中定义的大小

size\u t
的秩在任何情况下都大于或至少等于
int
类型的秩。这意味着,当编译器需要确定表达式的类型时,它会将低秩操作数转换为高秩操作数的类型。如果操作数具有相同的秩,但一个操作数具有无符号整数类型,而另一个操作数具有有符号整数类型,则公共类型为无符号整数类型

因此在if语句的条件下

if ( ( int )sizeof(int) > -1)

-1
被转换为无符号整数类型
size\u t
,由于其内部表示形式(所有位均设置为1)比
sizeof(int)

的值大,如果启用了更多警告,则可能会捕获到该值。实际上,由于标准指定从有符号到无符号转换的方式,负数的内部表示形式实际上并不重要<代码>-1将转换为相同的无符号值(无符号类型的最大值)。
if ( sizeof(int) > -1)