Vip*_*agi 0 c sizeof not-operator long-double integer-promotion
我在下面的 C 代码中对 long double 变量应用了 not 运算符:
#include <stdio.h>
int main()
{
long double a;
signed char b;
int arr[sizeof(!a+b)];
printf("\n%d",sizeof(arr));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码输出 16。我无法理解当我们在 long double 上应用 not 运算符时会发生什么,就像我们对a.
请帮助我了解这段代码发生了什么。
谢谢你!
来自 C 标准(6.5.3.3 一元算术运算符)
5 逻辑否定运算符的结果!如果其操作数的值比较不等于 0,则为 0,如果其操作数的值比较等于 0,则为 1。结果的类型为 int。表达式 !E 等价于 (0==E)。
所以在这个表达式中
sizeof(!a+b)
Run Code Online (Sandbox Code Playgroud)
子表达式!a的类型为int。
表达式中使用了操作数b对类型的整数提升,因为类型的等级小于类型的等级并且类型可以表示类型的所有值。int!a + bsigned charintintsigned char
来自 C 标准(6.3.1.1 布尔值、字符和整数)
- ...如果 int 可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为 int;否则,它被转换为无符号整数。这些被称为整数提升。58) 所有其他类型都不受整数提升的影响。
所以完整的表达式等价于
sizeof( int )
Run Code Online (Sandbox Code Playgroud)
如果sizeof( int )等于4那么你有一个数组声明如下
int arr[4];
Run Code Online (Sandbox Code Playgroud)
它的大小等于16说是4 * sizeof( int )。