首页 > 解决方案 > 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?为什么nData不能 be12.012by sizeof(nData += 2.0)

标签: csizeof

解决方案


因为 2.0 是 type 的常量double,所以表达式的nData + 2.0类型double符合 C 标准第 6.3.1.8 节中指定的“通常的算术转换”:

首先,如果任一操作数的对应实数类型为 long double ,则将另一个操作数转换为对应实数类型为 long double 的类型,而不改变类型域。

否则,如果任一操作数的对应实类型为 double ,则将另一个操作数转换为对应实类型为 double 的类型,而不改变类型域

所以sizeof评估为 a 的大小double

在 and 的情况下nData = 2.0nData += 2.0每个表达式都有类型int,因为那是赋值左侧的类型。所以sizeof评估为int.

此外,运算符的操作数仅在编译时sizeof对其类型进行评估。这意味着在运行时不会评估任何赋值或增量。因此,在您的第二个示例中,在使用. 在运行时计算操作数的唯一时间是操作数是否为可变长度数组。nDatasizeofsizeof


推荐阅读