猿问

if语句中的sizeof()运算符

#include <stdio.h>

int main(void)

{

    if (sizeof(int) > -1)

        printf("True");

    else

        printf("False");

}

它打印False。为什么sizeof()不返回值if?


慕森卡
浏览 579回答 3
3回答

饮歌长啸

sizeof它不是一个功能,它是一个操作员。括号不是运算符名称的一部分。它失败了,因为生成的值具有无符号类型size_t,这导致“通常的算术转换”&nbsp;-1转换为无符号,在这种情况下,它是一个非常大的数字。基本上你正在比较4 > 0xffffffffu,或者至少接近它。有关详情,请参阅此问题。

慕勒3428872

if语句中>运算符的操作数是sizeof(int)和-1。sizeof(int)是类型size_t,保证是无符号整数。在实践中,size_t很可能至少与unsigned int那里的任何系统一样大。-1是类型int,相当于signed int。不会发生整数提升,因为两个操作数都是足够大的整数类型。然后根据正式称为通常算术转换的C规则平衡两个操作数。这些状态(C11 6.3.1.8):...否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型。否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。上面的后者将会发生,因为(签名)int不能适合a的所有值size_t。因此-1转换为无符号整数。实际上,size_t很可能等同于unsigned int或unsigned long。在这样的变量中存储-1时发生的是实现定义的行为。在二进制补码计算机上(世界上所有计算机的99.9%),-1将被解释为0xFFFFFFFF(FF的数量取决于给定系统上int的大小)。4 > 0xFFFFFFFF&nbsp;评估为假。
随时随地看视频慕课网APP
我要回答