【问题标题】:Why does the sizeof operator in C gives different output in case of NOT operation?为什么 C 中的 sizeof 运算符在 NOT 运算的情况下会给出不同的输出?
【发布时间】:2020-08-28 13:31:56
【问题描述】:

我是编程新手,被 C 的 sizeof 操作符介绍给我。玩弄它,我发现了以下有趣的事情:

long long int a = 100;

printf("%d %d\n", sizeof(a), sizeof(!a));  // Output : 8 1

我知道sizeof(a)(在我的系统中)是 8。但我不明白为什么 sizeof(!a) 变成 1。

是不是因为!a变成了0,存储为char

而且,下面的代码更加增加了我的困惑:

long long int a = 100;
char b = 9;

printf("%d %d %d %d\n", sizeof(a), sizeof(b), sizeof(a+b), sizeof(!a+b)); // Output : 8 1 8 4

谁能解释一下,这里发生了什么?由于类型转换,char 应该转换为 long long int 对吧?如果是这样,我理解输出的8 1 8 部分。但是为什么 sizeof(!a+b) 是 4?

根据This answersizeof()返回size_t,大小为4字节。但无法从中得到我查询的答案。

【问题讨论】:

  • 输出不应该是 1 ,您很可能正在运行 C++ 编译器(C++ 是与 C 不同的语言)。然而,由于 printf 中的格式说明符不正确,整个程序会导致未定义的行为,因此任何事情都可能发生。
  • @M.M 是的,它是一个 C++ 编译器。另外,多亏了你,我才知道bool 是 C++ 中的数据类型,但它只是 C 中的别名。
  • 不要将类型转换与隐式类型提升引起的转换混为一谈。强制转换始终是显式的,并且始终由程序员使用(type) 完成。除了 bool vs int 问题,还有隐式转换,见stackoverflow.com/questions/46073295/…
  • @steve C 也有 bool 数据类型,但是在 C 中,! 运算符的结果没有 bool 数据类型

标签: c memory


【解决方案1】:

! 运算符的结果类型为int,因此sizeof(!a)sizeof(int) 相同。

这在C standard 的第6.5.3.3 节中记录了关于逻辑否定运算符!

逻辑否定运算符的结果为 0,如果 其操作数的值比较不等于 0,如果其操作数的值比较不等于 1 操作数比较等于 0。结果的类型为 int 表达式!E 等价于(0==E)

在大多数系统上,int 的大小为 4 个字节,因此 sizeof(int) 的计算结果为 4。如果您得到 1 作为 sizeof(!a) 的结果,那么您可能正在使用 C++ 编译器,其结果为! 的类型为 bool

【讨论】:

  • I understand sizeof(a) (in my system) is 8. But I could not understand why sizeof(!a) becomes 1. 这是什么行为?
  • @UmarFarooq 你在使用 c++ 编译器吗?如果是这样,! 的结果类型为 bool
猜你喜欢
  • 2018-01-19
  • 1970-01-01
  • 2022-07-27
  • 2021-05-28
  • 2012-05-29
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多