34

我读了这段代码,并有这一行

 switch (!!up + !!left) {

什么是!!运营商?两个逻辑非?

4

4 回答 4

54

是的,这是两个不。

!!ais 1ifa是非零并且0ifa0

您可以将其!!视为对 的钳位{0,1}。我个人认为这种用法是一种看起来很花哨的错误尝试。

于 2012-04-24T23:13:43.320 回答
13

你可以这样想象:

!(!(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
于 2012-04-24T23:33:16.150 回答
8

!!是一个更便携(C99 之前)的替代(_Bool).

于 2012-04-25T00:04:42.607 回答
4

你是对的。这是两个不。要了解为什么要这样做,请尝试以下代码:

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

于 2012-04-24T23:22:34.547 回答