2013-04-24 47 views
30

Mam trochę kodu C++, który szeroko wykorzystuje !!. Jestem trochę zakłopotany, ponieważ o ile mi wiadomo, !! nie jest operatorem na swoim, ale dwoma ! po sobie. Oznaczałoby to, że !!foo jest tym samym, co foo.Confused za pomocą podwójnego logicznego operatora (!!)

Czy istnieje jakieś miejsce i powód, dla którego !! ma sens? Zastanawiałem się, czy to może mieć trochę mądre znaczenie? Więc najpierw wykonaj trochę mądrą operację na foo, a następnie ! na wyniku? Ale wydaje mi się, że nie pamiętam, by ! był używany jako nieco mądry operator i nie wydaje mi się, żeby znalazł jakieś odniesienie, informując mnie, że tak jest. O ile mogę powiedzieć ! w używane tylko jako operator logiczny iw tym przypadku

!!foo == foo

+4

Można również napisać 'x +++++ y + 1', ale jest to zły pomysł. – msw

+0

@GrahamBorland Teraz zamierzam tam iść i głosować na to jako duplikat tego. –

+0

Możesz również przeczytać: [* co to jest !! w c? *] (http://stackoverflow.com/questions/14751973/what-is-in-c?lq=1). –

Odpowiedz

45

To nie jest tak proste jak podwójna negacja. Na przykład, jeśli masz x == 5, a następnie zastosuj dwa! Operatory (!!x), staną się 1 - więc służy do normalizowania wartości boolowskich w zakresie {0, 1}.

Należy pamiętać, że można użyć wartości zero jako wartości logicznej wartości false, a wartości innej niż wartość typu boolean wartości true, ale konieczne może być znormalizowanie wyniku do wartości 0 lub 1, co jest przydatne w przypadku, gdy użyteczny jest !!.

Jest to to samo, co x != 0 ? 1 : 0.

Również pamiętać, że to nie będzie prawdafoo jeśli nie jest w {0, 1} zestawie:

!!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; 
} 

Drukuje foo != !!foo.

+2

Ahhh thanx ... To było w pełni zrozumiałe, – inquam

+0

jakie mogą być możliwe przypadki użycia? –

+3

Powiedzmy, że masz jakieś miejsce, gdzie bool jest przechowywany jako 1 lub 0, w nieco lub coś. A wartość, którą sprawdzasz, to 5 (co będzie się liczyć jako prawdziwa), możesz zasadniczo zmienić to 5 w 1. – inquam

4

jeśli foo != 0, następnie !!foo == 1. Jest to w zasadzie sztuczka do konwersji na bool.

+1

'1' nie jest' bool'. To jest 'int'. –

+1

@Kerrek SB Wiem, mam na myśli rzeczywistą wartość. –

8

Może być używany jako skrót do przekształcania foo w wyrażenie boolowskie. Możesz zamienić wyrażenie nie-boolowskie w prawdę lub fałsz wyłącznie z jakiegoś powodu.

foo = !!foo okaże foo w 1 jeśli jest różna od zera, i pozostawić go na 0 jeśli już jest.

3

Jeśli foo nie jest typu bool, to będzie to !!foo. Tak więc !!foo może mieć wartość 1 lub 0.

+0

'0' i' 1' to 'int's, a nie' bool's. Mówimy tu o C++; może mylisz to z C? –

+0

Masz rację. Powinienem powiedzieć, że jest to prawda czy fałsz. :) –

1

Ta technika służy do bezpiecznej oceny zmiennej w kontekście logicznym. Jeśli masz normalną konwersację do bool (operator bool()) niepowiązane zmienne (z różnymi typami) mogą uczestniczyć w wyrażeniach logicznych w niechciany sposób. Wprowadzono definicję operator!, która zwraca zanegowaną wartość logiczną. A jego wynik musi zostać zanegowany ponownie. Wystarczy spojrzeć na Safe bool idiom.