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

问题描述

我在下面的C代码中对长双精度变量应用了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。我很难理解当我们对a进行操作而不是对long double使用运算符时会发生什么。

请帮助我了解这段代码的情况。

谢谢!

解决方法

根据C标准(6.5.3.3一元算术运算符)

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

所以在这个表达式中

sizeof(!a+b)

子表达式!a的类型为int

在表达式b中使用了操作数int到类型!a + b的整数提升,因为类型signed char的等级小于类型int和类型int可以代表类型signed char的所有值。

根据C标准(6.3.1.1布尔值,字符和整数)

  1. ...如果一个int可以表示原始类型的所有值(受限 通过宽度,对于位字段),将值转换为int; 否则,它将转换为unsigned int。这些被称为 整数促销。 58)所有其他类型均不变 促销。

因此完整的表达式等同于

sizeof( int )

如果sizeof( int )等于4,则您有一个声明为

的数组
int arr[4];

其大小等于16,即4 * sizeof( int )

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...