!!
を多用するC++コードがいくつかあります。私の知る限り、!!
はそれ自体では演算子ではなく、2つの!
が続いているので、ちょっと困惑しています。つまり、!!foo
はfoo
と同じです。
!!
が実際に意味をなす場所や理由はありますか?少し賢明な意味があるのではないかと考えていました。では、最初にfoo
でビット演算を実行し、次に結果に対して!
を実行しますか?しかし、!
がビット演算演算子として使用されていることを覚えていないようで、それを示す参照も見つからないようです。私が知る限り、!
は論理演算子としてのみ使用され、その場合は
!!foo == foo
二重否定ほど単純ではありません。たとえば、x == 5
がある場合、2つ適用します。演算子(!!x
)、1になります-したがって、{0, 1}
範囲のブール値を正規化するために使用されます。
ブール値falseとしてゼロを使用し、ブール値trueとして非ゼロを使用できることに注意してください。ただし、結果を0または1に正規化する必要がある場合があります。その場合、!!
が役立ちます。
x != 0 ? 1 : 0
と同じです。
また、これは当てはまらないことに注意してくださいfoo
が{0, 1}
にない場合set:
!!foo == foo
#include <iostream>
using namespace std;
int main()
{
int foo = 5;
if(foo == !!foo)
{
cout << "foo == !!foo" << endl;
}
else
{
cout << "foo != !!foo" << endl;
}
return 0;
}
foo != !!foo
を出力します。
foo
をブール式に変換するための省略形として使用できます。何らかの理由で、ブール式以外の式を排他的にtrueまたはfalseに変換したい場合があります。
foo = !!foo
は、ゼロ以外の場合はfoo
を1
に変換し、ゼロ以外の場合は0
のままにします。
if foo != 0
、次に!!foo == 1
。基本的にboolに変換するのはトリックです。
foo
がbool型でない場合、!!foo
になります。そう !!foo
は1または0にすることができます。
この手法は、ブールコンテキストで変数を安全に評価するために使用されます。 bool(operator bool()
)と通常の会話をしている場合、無関係な変数(型が異なる)が不要な方法でブール式に参加する可能性があります。否定されたブール値を返すoperator!
の定義が実装されています。そして、その結果は再び否定されなければなりません。 Safe bool idiom をご覧ください。