web-dev-qa-db-ja.com

!! c演算子、2つではありませんか?

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

 switch (!!up + !!left) {

とは !!演算子? 2つの論理否定?

27
JuanPablo

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

aがゼロ以外の場合は!!a1であり、a0の場合は0です。

!!は、いわば{0,1}へのクランプと考えることができます。私は個人的に、その使用法が派手に見える悪い試みだと思っています。

35
Armen Tsirunyan

あなたはそれをこのように想像することができます:

!(!(a))

あなたがそれを段階的に行うならば、これは理にかなっています

result = !42;    //Result = 0
result = !(!42)  //Result = 1 because !0 = 1  

これにより、任意の数値(-42、4.2fなど)で1が返されますが、0でのみ、これが発生します。

result = !0;    //Result = 1
result = !(!0)  //result = 0
7
Rodrigo

あなたが正しい。それは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.を出力します

3
thb