是的,它是两个感叹号。
!!a
当 a
非零时为 1
,当 a
等于 0
时为 0
。
你可以把 !!
看作是将值限定在 {0,1}
范围内。我个人认为这种用法是一种尝试显得高级的不好表现。
(_Bool)
(如果已经包含了stdbool.h
,则为(bool)
)适用于C99,但似乎过于依赖C99,并且理解如何将强制转换为布尔值的人要比理解!!
惯用法的人少得多。另一个选择是expr?1:0
,这只是丑陋而过于啰嗦的。 - R.. GitHub STOP HELPING ICE!(!(a))
如果您一步一步来做,这就有意义了。
result = !42; //Result = 0
result = !(!42) //Result = 1 because !0 = 1
这将返回1
与任何数字 (-42, 4.2f等),但只有在0
的情况下才会发生这种情况
result = !0; //Result = 1
result = !(!0) //result = 0
!!
是一个更便携的(C99之前的)(_Bool)
的替代选择。
你说得对。是两个nots。为了理解为什么要这样做,请尝试以下代码:
#include <stdio.h>
int foo(const int a)
{
return !!a;
}
int main()
{
const int b = foo(7);
printf(
"The boolean value is %d, "
"where 1 means true and 0 means false.\n",
b
);
return 0;
}
它输出的结果是 布尔值为1,其中1表示真(true),0表示假(false)
。如果去掉!!
,它会输出布尔值为7,其中1表示真(true),0表示假(false)
。
(up || left)
将产生0
或1
,而(!!up + !!left)
将产生0
、1
或2
。 - kittemon