! c运算符,是两个NOT吗?

我阅读这个代码 ,并有此行

switch (!!up + !!left) { 

什么是!! 操作员? 两个逻辑NOT?

是的,这是两个不是。

如果a是非零,则a1如果a0a0

你可以想到!! 就像夹紧到{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 

!!(_Bool)一种更便携的(C99之前的)替代品。

你是对的。 这是两个不是。 要明白为什么要这样做,请尝试下面的代码:

 #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.