sizeof运算符的操作数

PWS*_*PWS 4 c sizeof

我明白了结果

int nData = 10;
printf("%d", sizeof(nData + 2.0));
Run Code Online (Sandbox Code Playgroud)

是"8"

为什么每个结果

int nData = 10;
printf("%d", sizeof(nData = 2.0));
printf("%d", sizeof(nData += 2.0));
Run Code Online (Sandbox Code Playgroud)

不是8而是4?为什么nData不能12.0或12通过sizeof(nData += 2.0)?

dbu*_*ush 6

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

首先,如果任一操作数的相应实数类型是long double,则另一个操作数在不改变类型域的情况下被转换为对应的实类型为long double的类型.

否则,如果任一操作数的相应实数类型为double,则将另一个操作数转换为类型为domain的类型,其类型为对应的实数类型为double

所以sizeof评估a的大小double.

在的情况下nData = 2.0和nData += 2.0,每个表达式的类型为int,因为这是分配的左手边的类型.所以sizeof评估一个大小int.

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