【发布时间】: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 answer,sizeof()返回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 数据类型