在 C 中对 long double 应用“not”运算符

Vip*_*agi 0 c sizeof not-operator long-double integer-promotion

我在下面的 C 代码中对 long double 变量应用了 not 运算符:

#include <stdio.h>

int main()
{
   long double a;
   signed char b;
   int arr[sizeof(!a+b)];
   printf("\n%d",sizeof(arr));
   return 0;
}

Run Code Online (Sandbox Code Playgroud)

这段代码输出 16。我无法理解当我们在 long double 上应用 not 运算符时会发生什么,就像我们对a.

请帮助我了解这段代码发生了什么。

谢谢你!

Vla*_*cow 8

来自 C 标准(6.5.3.3 一元算术运算符)

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

所以在这个表达式中

sizeof(!a+b)
Run Code Online (Sandbox Code Playgroud)

子表达式!a的类型为int

表达式中使用了操作数b对类型的整数提升,因为类型的等级小于类型的等级并且类型可以表示类型的所有值。int!a + bsigned charintintsigned char

来自 C 标准(6.3.1.1 布尔值、字符和整数)

  1. ...如果 int 可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为 int;否则,它被转换为无符号整数。这些被称为整数提升。58) 所有其他类型都不受整数提升的影响。

所以完整的表达式等价于

sizeof( int )
Run Code Online (Sandbox Code Playgroud)

如果sizeof( int )等于4那么你有一个数组声明如下

int arr[4];
Run Code Online (Sandbox Code Playgroud)

它的大小等于16说是4 * sizeof( int )