[英]operands for sizeof operator
我明白了结果
int nData = 10;
printf("%d", sizeof(nData + 2.0));
是“8”
为什么每个结果
int nData = 10;
printf("%d", sizeof(nData = 2.0));
printf("%d", sizeof(nData += 2.0));
不是8而是4? 为什么nData
不能是sizeof(nData += 2.0)
12.0
或12
?
因为2.0是double
类型的常量,所以表达式nData + 2.0
具有类型double
,根据C标准的6.3.1.8节中指定的“通常算术转换”:
首先,如果任一操作数的相应实数类型是long double,则另一个操作数在不改变类型域的情况下被转换为对应的实类型为long double的类型。
否则,如果任一操作数的相应实数类型为double,则将另一个操作数转换为类型为domain的类型,其类型为对应的实数类型为double
因此sizeof
评估为double
的大小。
在nData = 2.0
和nData += 2.0
的情况下,每个表达式都具有int
类型,因为这是赋值左侧的类型。 所以sizeof
评估为int
的大小。
此外,仅在编译时评估sizeof
运算符的操作数的类型。 这意味着不会在运行时评估任何赋值或增量。 所以在你的第二个例子中, nData
在使用sizeof
的两行之后仍然具有值10。 在运行时评估sizeof
的操作数的唯一时间是操作数是否是可变长度数组。
为什么
nData
不能是sizeof(nData += 2.0)
12.0
或12
?
那么, sizeof
是一个编译器时间操作符 ,它对数据类型而不是值进行操作。
换句话说,除非参数是VLA ,否则不会计算sizeof
的操作数。
引用C11
,章节§6.5.3.4
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 大小由操作数的类型确定。 如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量。
所以,在你的情况下,
printf("%d", sizeof(nData + 2.0)); // data == int, 2.0 == double
是相同的
printf("%d", sizeof(double)); // as the resulting "type" of the addition,
// 'int + double' would be 'double'
哪个应该更好
printf("%zu", sizeof(double)); //not %d
如sizeof
产生size_t
类型。
另外,关于2.0
是double
类型,来自章节§6.4.4.2
浮点常量具有有效位部分,后面可以跟一个指数部分和一个指定其类型的后缀。 有效数部分的分量可以包括表示整数部分的数字序列,后面是句点(。),后面是表示分数部分的数字序列。 [...]
和
未填充的浮点常量具有
double
类型。 [...]
因此,像2.0
这样的常量值具有double
类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.