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

标签 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;
}
我发现如果表达式包含赋值运算符 =隐式(如预增量)或显式(如 x=x+y ),则表达式不会在 sizeof 中求值运算符(operator)。
我对吗?

最佳答案

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

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

  • 尺寸是基于此计算的。
    在您的平台中,很可能是 sizeof(int)4sizeof(double)8 ,所以你会看到相应的输出。
    也就是说,sizeof产生 size_t 类型的结果,您必须使用 %zu用于打印结果的格式说明符。

    关于c - 为什么 sizeof 运算符对某些表达式的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63470184/

    相关文章:

    c - 为什么 gcc 使用 -O0 进行一些优化

    c - zmq_ctx_term() 在套接字关闭时阻塞

    c++ - 在 Visual C++ 中传递给函数时,Sizeof 数组自动更改

    c - 为什么 sizeof 的赋值会改变从 size_t 赋值给 int 的变量类型?

    java - 从 java : Why doesn't the array get printed? 传递的 c 中打印数组

    c - 在分配时我们是否必须在编写程序时提及数组大小

    c++ - 类指针和二元运算符 + 类指针类型的无效操作数

    java - Java 运算符总是从左到右阅读吗?

    c++ - 多项式除法重载运算符

    c - 如何计算两个地址之间的距离?