为什么三次操作的sizeof结果为4?

时间:2018-10-09 02:17:57

标签: c sizeof

谁可以帮助解释程序结果:

  int main()
    {
    char a=1;
    short b=1;

    printf("%d\n", sizeof((b==a)?a:b));
    printf("%d %d", sizeof(a), sizeof(b));

    return 0;
    }

打印出是

4
1 2

2 个答案:

答案 0 :(得分:4)

来自C标准#6.5.3.4p2 [强调我的]

  

2 sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。 大小取决于操作数的类型。结果是一个整数。如果操作数的类型是可变长度数组类型,则对操作数求值;否则,不评估操作数,结果为整数常量。

在表达式中:

sizeof((b==a)?a:b)

由于默认类型提升 1)charshort将被转换为int,整个表达式的计算结果为int类型。因此,您得到的输出为4

此外,sizeof运算符的结果类型为size_t。您应该使用%zu格式说明符,而不要使用%d


1)Default Type Promotions and Conversions

答案 1 :(得分:1)

在表达式中使用类型等级低于int(例如charshort)的整数值时,它会自动提升 strong>键入int

对于表达式(b==a)?a:b,两个可能的值都提升为类型int,因此表达式整体上的类型为int。因此,sizeof运算符正在评估int的大小,该大小在您的计算机上为4。

还要注意,传递给sizeof的表达式在运行时不会求值。它仅由编译器解析以确定其类型。 sizeof的操作数在运行时唯一的求值是操作数是否为可变长度数组。