为什么双重否定力值成为布尔?

如果x是像1010一样的4位字,并且您执行了操作!! x,

  • 不会第一个!x返回0101,
  • 第二个!(!x)返回1010?
  • 相反,它返回... 0001或... 0000。 为什么是这样?


    在C中, !x是1或0,因此!!x是一个“折叠为0或1运算符”,意思是任何非零数字映射为1,并且0保持原样。 这在有些情况下很有用。

    在C ++中, !x是一个bool类型,因此!!x是“折叠为假或真运算符”,意思是任何非零数字映射为true ,零映射为false


    ! 运算符执行逻辑否定。 如果它的参数非零,则结果为0.如果参数为0,则结果为1。

    你所描述的是按位补数运算符 ,用~表示。

    这些都在C标准的第6.5.3.3节中描述:

    4的结果~操作者是其(推动)操作数的按位求补(即,结果中的每个位被设置当且仅当在转换操作数的相应位没有被设置)。 整数提升在操作数上执行,并且结果具有提升类型。 如果升级类型是无符号类型,则表达式~E等于该类型中表示的最大值减E

    5逻辑否定运算符的结果! 如果其操作数的值不等于0,则其值为0;如果其操作数的值等于0,则值为1.结果的类型为int 。 表达式!E相当于(0==E)


    ! 是一个布尔运算符,因此它会将数字转换为布尔值(任何非零值为true ,零总是为false )。 那另一个! 颠倒布尔。

    链接地址: http://www.djcxy.com/p/73561.html

    上一篇: Why does double negation force values to become a bool?

    下一篇: Cause compilation error in C89 if two types are not the same