我读了这段代码,并有这一行
switch (!!up + !!left) {
什么是!!
运营商?两个逻辑非?
是的,这是两个不。
!!a
is 1
ifa
是非零并且0
ifa
是0
您可以将其!!
视为对 的钳位{0,1}
。我个人认为这种用法是一种看起来很花哨的错误尝试。
你可以这样想象:
!(!(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)
.
你是对的。这是两个不。要了解为什么要这样做,请尝试以下代码:
#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;
}
它输出The boolean value is 1, where 1 means true and 0 means false.
如果你放弃!!
,它会输出The boolean value is 7, where 1 means true and 0 means false.