应用;不是";C中长双精度算子
我在下面的C代码中对长双变量应用了not运算符:应用;不是";C中长双精度算子,c,sizeof,integer-promotion,long-double,not-operator,C,Sizeof,Integer Promotion,Long Double,Not Operator,我在下面的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; } #包括 int main() { 长双a; 签名字符b; int arr[sizeof(!a+b)]; printf(“\n%d”,
#include <stdio.h>
int main()
{
long double a;
signed char b;
int arr[sizeof(!a+b)];
printf("\n%d",sizeof(arr));
return 0;
}
#包括
int main()
{
长双a;
签名字符b;
int arr[sizeof(!a+b)];
printf(“\n%d”,sizeof(arr));
返回0;
}
此代码输出16。我很难理解当我们在长双精度上应用not运算符时会发生什么,就像我们在
a
上所做的那样
请帮助我理解这个代码发生了什么
谢谢大家! 来自C标准(6.5.3.3一元算术运算符)
5逻辑求反运算符的结果!如果
其操作数比较不等于0,如果其操作数的值
比较值等于0结果的类型为int。表情!E是
相当于(0==E)
所以在这个表达式中
sizeof(!a+b)
子表达式!a
的类型为int
表达式中使用了操作数b
到类型int
的整数提升!a+b
是因为类型有符号字符的秩小于类型int
的秩,并且类型int
可以表示类型有符号字符的所有值
来自C标准(6.3.1.1布尔值、字符和整数)
…如果int可以表示原始类型的所有值(受限
根据宽度(对于位字段),将值转换为int;
否则,它将转换为无符号整数
整数促销。58)所有其他类型均以整数形式保持不变
晋升
因此,完整表达式等价于
sizeof( int )
如果sizeof(int)
等于4
,那么您有一个声明如下的数组
int arr[4];
它的大小等于16
,也就是4*sizeof(int)
为什么要这样写代码?如果不求反,会得到什么输出?!a
具有类型int
<代码>(!a)+b
具有类型int
。。。OTOH,取决于优先级(我甚至不想去想),!(a+b)
的类型是int
==>最终结果是一样的:sizeof(!a+b)=sizeof(!a)+b)==sizeof(!(a+b))==sizeof(int)
,那么你有intarr[4]
这段代码有什么问题?我写错了吗?“当我们在长双精度上应用not运算符时”,我们得到0
或1
类型int