sizeof运算符的操作数

时间:2019-01-31 14:06:47

标签: c sizeof

我了解了

的结果
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}不能使nData12.0成为12sizeof(nData += 2.0)

2 个答案:

答案 0 :(得分:6)

由于2.0是类型double的常量,根据C标准第6.3.1.8节中指定的“常规算术转换”,表达式nData + 2.0的类型为double:< / p>

  

首先,如果任一操作数的对应实型为long double   ,另一个操作数将在不更改类型域的情况下转换为相应的实型类型为long double的类型。

     

否则,如果两个操作数的对应实型   是double,另一个操作数将在不更改类型域的情况下转换为相应的实型类型为   

所以sizeof等于double的大小。

对于nData = 2.0nData += 2.0,每个表达式的类型均为int,因为这是赋值左侧的类型。因此sizeof评估为int的大小。

此外,sizeof运算符的操作数仅在编译时进行类型评估。这意味着在运行时不会评估任何分配或增量。因此,在第二个示例中,在使用nData的两行之后,sizeof仍将具有值10。 sizeof的操作数在运行时唯一的求值是操作数是否为可变长度数组。

答案 1 :(得分:4)

  

为什么nData不能将12.012变成sizeof(nData += 2.0)

好吧,sizeofcompiler 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