在 C 语言中对长双精度应用"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。我在理解当我们在长二重上应用not运算符时会发生什么方面有问题,就像我们对a所做的那样。

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

谢谢!

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

5逻辑否定运算符的结果!如果的值为0其操作数与0比较不相等,如果其操作数的值为比较等于0结果的类型为int。表情!E是相当于(0==E(。

所以在这个表达式中

sizeof(!a+b)

子表达式CCD_ 2具有类型CCD_。

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

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

  1. 。。。如果int可以表示原始类型的所有值(受限制通过宽度,对于位字段(,该值被转换为int;否则,它将转换为无符号int整数促销。58(所有其他类型都不受整数的影响促销

因此完整表达式等效于

sizeof( int )

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

int arr[4];

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

相关内容

  • 没有找到相关文章

最新更新