0

我在下面的 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;
}

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

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

谢谢你!

4

1 回答 1

8

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

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

所以在这个表达式中

sizeof(!a+b)

子表达式!a的类型为int

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

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

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

所以完整的表达式等价于

sizeof( int )

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

int arr[4];

它的大小等于是164 * sizeof( int )

于 2020-08-21T12:33:53.820 回答