为什么 C 中的 sizeof 运算符在 NOT 操作的情况下会给出不同的输出?

ste*_*eve 3 c memory

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

long long int a = 100;

printf("%d %d\n", sizeof(a), sizeof(!a));  // Output : 8 1
Run Code Online (Sandbox Code Playgroud)

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

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

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

dbu*_*ush 6

!运算符的结果具有 type int,因此sizeof(!a)sizeof(int).

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

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

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