Doble negación en C++

Resuelto Brian Gianforcaro asked hace 16 años • 14 respuestas

Acabo de llegar a un proyecto con una base de código bastante grande.

Trabajo principalmente con C++ y gran parte del código que escriben utiliza doble negación para su lógica booleana.

 if (!!variable && (!!api.lookup("some-string"))) {
       do_some_stuff();
 }                                   

Sé que estos tipos son programadores inteligentes, es obvio que no hacen esto por accidente.

No soy un experto experimentado en C++, mi única suposición de por qué están haciendo esto es que quieren estar absolutamente seguros de que el valor que se está evaluando es la representación booleana real. Entonces lo niegan, luego lo niegan nuevamente para devolverlo a su valor booleano real.

¿Es esto correcto o me falta algo?

Brian Gianforcaro avatar Oct 30 '08 05:10 Brian Gianforcaro
Aceptado

Es un truco para convertir a bool.

Don Neufeld avatar Oct 29 '2008 22:10 Don Neufeld

En realidad, es un modismo muy útil en algunos contextos. Tome estas macros (ejemplo del kernel de Linux). Para GCC, se implementan de la siguiente manera:

#define likely(cond)   (__builtin_expect(!!(cond), 1))
#define unlikely(cond) (__builtin_expect(!!(cond), 0))

¿Por qué tienen que hacer esto? GCC __builtin_expecttrata sus parámetros como longy no bool, por lo que es necesario que haya alguna forma de conversión. Como no saben qué condes cuando escriben esas macros, lo más general es usar simplemente el !!modismo.

Probablemente podrían hacer lo mismo comparando con 0, pero en mi opinión, en realidad es más sencillo hacer la doble negación, ya que es lo más cercano a una conversión a bool que tiene C.

Este código también se puede usar en C++... es algo de mínimo común denominador. Si es posible, haga lo que funcione tanto en C como en C++.

Tom Barta avatar Oct 30 '2008 04:10 Tom Barta

Los codificadores piensan que convertirá el operando a bool, pero debido a que los operandos de && ya están implícitamente convertidos a bool, es completamente redundante.

fizzer avatar Oct 29 '2008 23:10 fizzer