为什么 sizeof 运算符对某些表达式的作用不同?

Why is the sizeof operator working differently for some expressions?

我知道 x++ 或函数调用等表达式不会在 sizeof 运算符中求值。

当我 运行 下面的代码时,我得到了 4 8 8 作为输出。 有人可以向我解释第 6、7、8 行实际发生了什么吗?

#include <stdio.h>
int main()
{
  int x=10;
  double y=10.0;
  printf("%d ",sizeof (x=x+y));    
  printf("%d ",sizeof (y=x+y));     
  printf("%d ",sizeof (x+y));
  return 0;
}

我发现如果表达式包含一个赋值运算符 = 隐式(如预递增)或显式(如 x=x+y),则表达式不会在 sizeof 运算符.

我说得对吗?

sizeof 运算符对参数的数据类型进行操作。在你的代码中

  • 表达式 (x=x+y) 产生类型 int,与 x
  • 相同
  • 表达式 (y=x+y) 产生类型 double,与 y
  • 相同
  • 表达式 x+y 根据通常的算术转换规则生成类型 double

尺码以此计算。

在您的平台中,sizeof(int) 可能是 4,而 sizeof(double)8,因此您会看到相应的输出。

也就是说,sizeof 会产生 size_t 类型的结果,您必须使用 %zu 格式说明符来打印结果。

对表达式进行求值,只是这些求值的结果不同:

x=x+y

可以读作:

int = float + int

发生的事情是,计算结果然后转换为 int,因此您得到结果 4:sizeof(int) = 4。

第二行类似,但有浮点数。

在最后一行计算 sizeof (float + int) 等于 sizeof(float) = 8。

sizeof 评估类型。

x 是一个 int,在您的系统上似乎有 4 个字节 的大小。

y 是一个 double 并且在您的系统上似乎有 8 字节 的大小。

sizeof (x+y) 将计算为两者中最大的一个,因此 double8 字节 .

x=x+y 仍然是 int,因为将从 double x+y.

转换为 int 类型

因此sizeof (x=x+y)4字节.

y=x+y 仍然是 double,因为 x+y 属于 double.

类型

因此sizeof (y=x+y)8字节.