34

私はこのコードを読んで、この行を持っています

 switch (!!up + !!left) {

!!演算子とは何ですか?2つの論理否定?

4

4 に答える 4

54

はい、それは2つの違いです。

!!aがゼロ以外の場合1、およびa0a0

!!クランプと考えることができます{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

あなたが正しい。それは2つのことではありません。これを行う理由を確認するには、次のコードを試してください。

#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 に答える