私はこのコードを読んで、この行を持っています
switch (!!up + !!left) {
!!
演算子とは何ですか?2つの論理否定?
はい、それは2つの違いです。
!!a
がゼロ以外の場合1
、およびa
0
a
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)
です。
あなたが正しい。それは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.