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

Cla*_*ker 3 c operators sizeof

我知道像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;
}
Run Code Online (Sandbox Code Playgroud)

我发现如果表达式=隐式地(如预增量)或显式地(如x=x+y)包含赋值运算符,则表达式不会在sizeof运算符中求值。

我对吗?

Sou*_*osh 9

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

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

尺寸是基于此计算的。

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

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

  • 从技术上讲,我认为表达式产生类型“int&amp;”、“double&amp;”和“double”。当然,“sizeof”给出了相同的结果。 (2认同)
  • @cigien 为什么是“&amp;”? (2认同)
  • 啊,CPP 部分。明显地。 (2认同)