2013-04-24 4 views
30

!!を広く使用するC++コードがあります。私が知る限りでは、!!はそれ自身の演算子ではなく、2つの!の後にあるので、私はちょっと困惑しています。つまり、!!fooはちょうどfooと同じです。二重論理NOT(!!)演算子を使用すると混乱します

!!が実際に意味を持つ場所や理由はありますか?少し賢明な意味があるのではないかと考えていましたか?だから最初にfooでビット単位の操作を実行し、次に結果として!を実行しますか?しかし、私はビット賢明な演算子として使用されている!を覚えているようではないと私にそれを教えている参照を見つけるように思われません。私の知る限りfoo != 0場合のみ!!foo == 1そして、論理演算子として、その場合には

!!foo == foo

+4

「x +++++ y + 1」と書くこともできますが、それは悪い考えです。 – msw

+0

@GrahamBorland今私はそこに行ってこれを複製して投票するつもりです。 –

+0

あなたはこれを読むことも好きかもしれません。 in c?*](http://stackoverflow.com/questions/14751973/what-is-in-c?lq=1)。 –

答えて

45

ダブルネゲートほど簡単ではありません。たとえば、x == 5があり、2つ適用するとします。演算子(!!x)は1になるため、ブール値を正規化するために{0, 1}の範囲で使用されます。

ブール値は0、ブール値はtrue以外はゼロを使用できますが、結果を0または1に正規化する必要があることに注意してください。!!が便利です。

x != 0 ? 1 : 0と同じです。

!!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{0, 1}セットに含まれないfoo場合

また、ノートこれは真実ではないだろうということ。

+2

Ahhh thanx ...それは完全な意味を作った – inquam

+0

これにはどのような可能性がありますか? –

+3

ブールが1または0として、ビットなどに格納される場所があるとします。あなたがチェックする値は5です(これは本当に数えます)。基本的にはその5を1に変えることができます。 – inquam

4

を使用して!を言うことができるように。それは基本的にはboolに変換するトリックです。

+1

'1'は' bool'ではありません。それは 'int'です。 –

+1

@Kerrek SB私は知っている、私は実際の値を参照しています。 –

8

これは、fooをブール式にするための略語として使用できます。なんらかの理由で非論理式を真または偽にすることができます。

foo = !!fooは、ゼロでない場合はfoo1に変換し、すでにある場合は0のままにしておきます。

3

fooがboolタイプでない場合は、!!fooとなります。したがって、!!fooは1または0になります。

+0

'0'と' 1'は 'bool'ではなくint型です。ここではC++について話しています。多分あなたはこれをCと混同していますか? –

+0

あなたは正しいです。私は真実か偽かを言いました。 :) –

1

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