web-dev-qa-db-ja.com

二重論理否定(!!)演算子の使用により混乱

!!を多用するC++コードがいくつかあります。私の知る限り、!!はそれ自体では演算子ではなく、2つの!が続いているので、ちょっと困惑しています。つまり、!!foofooと同じです。

!!が実際に意味をなす場所や理由はありますか?少し賢明な意味があるのではないかと考えていました。では、最初にfooでビット演算を実行し、次に結果に対して!を実行しますか?しかし、!がビット演算演算子として使用されていることを覚えていないようで、それを示す参照も見つからないようです。私が知る限り、!は論理演算子としてのみ使用され、その場合は

!!foo == foo

31
inquam

二重否定ほど単純ではありません。たとえば、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を出力します。

49
Nemanja Boric

fooをブール式に変換するための省略形として使用できます。何らかの理由で、ブール式以外の式を排他的にtrueまたはfalseに変換したい場合があります。

foo = !!fooは、ゼロ以外の場合はfoo1に変換し、ゼロ以外の場合は0のままにします。

8
Victor Sand

if foo != 0、次に!!foo == 1。基本的にboolに変換するのはトリックです。

4
Avidan Borisov

fooがbool型でない場合、!!fooになります。そう !!fooは1または0にすることができます。

3
Tobias Müller

この手法は、ブールコンテキストで変数を安全に評価するために使用されます。 bool(operator bool())と通常の会話をしている場合、無関係な変数(型が異なる)が不要な方法でブール式に参加する可能性があります。否定されたブール値を返すoperator!の定義が実装されています。そして、その結果は再び否定されなければなりません。 Safe bool idiom をご覧ください。

1
Jan Herrmann