微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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 )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。