如何解决在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布尔值,字符和整数)
- ...如果一个int可以表示原始类型的所有值(受限 通过宽度,对于位字段),将值转换为int; 否则,它将转换为unsigned int。这些被称为 整数促销。 58)所有其他类型均不变 促销。
因此完整的表达式等同于
sizeof( int )
如果sizeof( int )
等于4
,则您有一个声明为
int arr[4];
其大小等于16
,即4 * sizeof( int )
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。