为什么某些表达式的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;
}

我发现,如果一个表达式包含一个隐式(如预增量)或显式(如=)的赋值运算符x=x+y,则该表达式不会在{{1 }}运算符。

我说得对吗?

解决方法

sizeof运算符对自变量的数据类型进行操作。在您的代码中

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

尺寸是基于此计算的。

在您的平台中,sizeof(int)4,而sizeof(double)8,所以您会看到相应的输出。

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

,

sizeof计算类型。

xint,在您的系统上大小为 4个字节

ydouble,在您的系统上大小为 8个字节

sizeof (x+y)将计算两个值中的最大值,即double 8个字节

x=x+y仍然是int,因为将从int doublex+y类型的转换。

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

y=x+y仍然是double,因为x+y的类型为double

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

,

对表达式进行评估,只是这些评估的结果有所不同:

x=x+y

可以读为:

int = float + int

发生的是,先计算该结果,然后将其转换为int,然后得到结果4:sizeof(int)= 4。

第二行是相似的,但带有浮点数。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...