谁可以帮助解释程序结果:
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
答案 0 :(得分:4)
来自C标准#6.5.3.4p2 [强调我的]
2 sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。 大小取决于操作数的类型。结果是一个整数。如果操作数的类型是可变长度数组类型,则对操作数求值;否则,不评估操作数,结果为整数常量。
在表达式中:
sizeof((b==a)?a:b)
由于默认类型提升 1),char
和short
将被转换为int
,整个表达式的计算结果为int
类型。因此,您得到的输出为4
。
此外,sizeof
运算符的结果类型为size_t
。您应该使用%zu
格式说明符,而不要使用%d
。
答案 1 :(得分:1)
在表达式中使用类型等级低于int
(例如char
或short
)的整数值时,它会自动提升 strong>键入int
。
对于表达式(b==a)?a:b
,两个可能的值都提升为类型int
,因此表达式整体上的类型为int
。因此,sizeof
运算符正在评估int
的大小,该大小在您的计算机上为4。
还要注意,传递给sizeof
的表达式在运行时不会不求值。它仅由编译器解析以确定其类型。 sizeof
的操作数在运行时唯一的求值是操作数是否为可变长度数组。