bool c gcc boolean boolean-expression

bool - ¿Qué es "!!" en C?



if boolean c (7)

Esta pregunta ya tiene una respuesta aquí:

He encontrado el siguiente fragmento:

pt->aa[!!(ts->flags & MASK)] = -val;

  1. Que hace !! (dobles signos de exclamación / exclamación / dos no operadores) representan en c?
  2. No es (!!NULL) == NULL ?

  1. !!x es solo un !(!x) .
  2. si NULL se define como 0, entonces !!NULL == !!0 == !(!0) == !(1) == 0 .

!! es una forma decente de silenciar el compilador en ciertas situaciones, como la asignación en un condicional con más de una expresión, por ejemplo:

int _blah = 100; int *blah; if ( _blah > 100 && !!(blah = &_blah) ) { // do stuff }

No recomiendo esto: las advertencias generalmente están ahí para aplicar buenas prácticas de codificación.


Comúnmente (ab) se usa para convertir cualquier valor en el int s 0 o 1 mediante la aplicación repetida del operador boolean not,! .

Por ejemplo !56 es 0, ya que 56 es "verdadero" cuando se ve como un booleano. Esto significa que !!56 es 1, ya que !0 es 1.


Convierte un número en un booleano canónico.

Y tenga en cuenta que en este caso es fundamental hacerlo, ya que el resultado se utiliza para indexar una matriz.


En C99 puedes reemplazarlo por

#include <stdbool.h> pt->aa[(bool)(ts->flags & MASK)] = -val;

Por supuesto, si su código debe ser portátil para C89, ¡será mejor que lo haga! Truco o

pt->aa[(ts->flags & MASK)!=0] = -val;

o

pt->aa[(ts->flags & MASK)?1:0] = -val;

El código generado será ciertamente idéntico.


! es negación. Entonces !! es la negación de la negación. Lo que es importante es el hecho de que el resultado será un int .

  • !!x si x == 0 es !!0 , eso es !1 , eso es 0 .
  • !!x si x != 0 es !!(!0) , eso es !!1 , eso es !0 , eso es 1 .

!! se usa comúnmente si quiere convertir cualquier valor distinto de cero a 1, mientras que está seguro de que 0 sigue siendo 0.

Y de hecho, !!NULL == NULL , ya que !!NULL == !!0 y !!0 == !1 y finalmente !1 == 0 .

En consecuencia, en el fragmento corto de código que citó, el subíndice de matriz será 0 si el valor de la expresión entre paréntesis es NULL y 1 caso contrario.


!E es lo mismo que E == 0 entonces !!E es lo mismo que (E == 0) == 0 . !! se usa para normalizar valores booleanos.