我了解了
的结果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?为什么{{1}不能使nData
或12.0
成为12
或sizeof(nData += 2.0)
?
答案 0 :(得分:6)
由于2.0是类型double
的常量,根据C标准第6.3.1.8节中指定的“常规算术转换”,表达式nData + 2.0
的类型为double
:< / p>
首先,如果任一操作数的对应实型为long double ,另一个操作数将在不更改类型域的情况下转换为相应的实型类型为long double的类型。
否则,如果两个操作数的对应实型 是double,另一个操作数将在不更改类型域的情况下转换为相应的实型类型为
所以sizeof
等于double
的大小。
对于nData = 2.0
和nData += 2.0
,每个表达式的类型均为int
,因为这是赋值左侧的类型。因此sizeof
评估为int
的大小。
此外,sizeof
运算符的操作数仅在编译时进行类型评估。这意味着在运行时不会评估任何分配或增量。因此,在第二个示例中,在使用nData
的两行之后,sizeof
仍将具有值10。 sizeof
的操作数在运行时唯一的求值是操作数是否为可变长度数组。
答案 1 :(得分:4)
为什么
nData
不能将12.0
或12
变成sizeof(nData += 2.0)
?
好吧,sizeof
是compiler time operator,它对数据类型而不是值进行操作。
换句话说,除了参数is 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
。