Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用;不是";C中长双精度算子_C_Sizeof_Integer Promotion_Long Double_Not Operator - Fatal编程技术网

应用;不是";C中长双精度算子

应用;不是";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”,

我在下面的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”,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