为什么双重否定迫使价值成为一个布尔?

时间:2018-02-07 19:53:38

标签: c++ c

如果x是像1010这样的4位字,那么你做了操作!! x,

  • 不会是第一个!x返回0101,
  • 第二个!(!x)返回1010?

而是返回...... 0001或... 0000。这是为什么?

3 个答案:

答案 0 :(得分:7)

在C中,!x是1或0,因此!!x是"折叠为0或1运算符"在某种意义上,任何非零数字都映射到1,而0保持不变。 可以在某些场合有用。

在C ++中,!xbool类型,因此!!x是"崩溃到假或真正的运算符"在某种意义上,任何非零数字都映射到true,零被映射到false

答案 1 :(得分:4)

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

您要描述的是按位补码运算符,由~表示。

这些都在C standard

的第6.5.3.3节中描述
  

4 ~运算符的结果是其(提升的)操作数的按位补码(也就是说,结果中的每个位都设置为且仅当且   如果未设置转换后的操作数中的相应位)。该   对操作数执行整数提升,结果为   推广类型。如果提升的类型是无符号类型,则   表达式~E等于可表示的最大值   该类型减去E

     

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

答案 2 :(得分:2)

!是一个布尔运算符,因此它会将数字转换为bool(任何非零值为true,零始终为false)。另一个!反转了布尔。