我在下面的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布尔值、字符和整数(
- 。。。如果int可以表示原始类型的所有值(受限制通过宽度,对于位字段(,该值被转换为int;否则,它将转换为无符号int整数促销。58(所有其他类型都不受整数的影响促销
因此完整表达式等效于
sizeof( int )
如果sizeof( int )
等于4
,那么您有一个像一样声明的数组
int arr[4];
其大小等于16
,即等于4 * sizeof( int )
。