Confus par l’utilisation de l’opérateur double logique non (!!)

J’ai du code C ++ qui en fait un usage intensif !! . Je suis un peu dérouté car pour autant que je sache !! n’est pas un opérateur à part, mais à deux ! l’un après l’autre. Donc, cela voudrait dire que !!foo est la même chose que foo .

Y a-t-il un endroit et ou une raison quand !! fait sens? Je pensais si cela pourrait peut-être avoir un sens un peu sage? Donc, vous effectuez d’abord une opération sage sur foo et ensuite ! sur le résultat? Mais je ne semble pas me souvenir ! être utilisé comme un peu sage et ne semble trouver aucune référence me disant que ce soit le cas. Autant que je sache ! dans uniquement utilisé en tant qu’opérateur logique et dans ce cas

!!foo == foo

Ce n’est pas aussi simple que la double négation. Par exemple, si vous avez x == 5 , puis appliquez-en deux! opérateurs ( !!x ), il deviendra 1 – il est donc utilisé pour normaliser les valeurs booléennes dans la plage {0, 1} .

Notez que vous pouvez utiliser zéro comme boolean false et non nul pour boolean true, mais vous devrez peut-être normaliser votre résultat sur 0 ou 1, et c’est à ce moment !! est utile.

C’est la même chose que x != 0 ? 1 : 0 x != 0 ? 1 : 0 .

Notez également que cela ne sera pas vrai si foo n’est pas entre {0, 1} :

!!foo == foo

 #include  using namespace std; int main() { int foo = 5; if(foo == !!foo) { cout << "foo == !!foo" << endl; } else { cout << "foo != !!foo" << endl; } return 0; } 

Imprime foo != !!foo .

Il peut être utilisé comme raccourci pour transformer foo en une expression booléenne. Vous voudrez peut-être transformer une expression non booléenne en vrai ou en faux exclusivement pour une raison quelconque.

foo = !!foo va transformer foo en 1 s’il est non nul, et le laisser à 0 s’il l’est déjà.

si foo != 0 , alors !!foo == 1 . C’est fondamentalement une astuce pour convertir en bool.

Si foo n’est pas de type bool, alors !!foo sera. Alors !!foo peut être 1 ou 0.

Cette technique est utilisée pour évaluer en toute sécurité une variable dans un contexte booléen. Si vous avez une conversation normale à bool ( operator bool() ), des variables non liées (avec des types différents) peuvent participer aux expressions booléennes de manière non souhaitée. Une définition d’ operator! qui renvoie une valeur booléenne annulée. Et son résultat doit être annulé à nouveau. Il suffit de jeter un coup d’œil à l’ idiome Safe bool .