Advertencia C6290

Operación bit a bit en el resultado lógico: ! tiene mayor prioridad que &. Use && o (!( x & y)) en su lugar)

Esta advertencia indica una posible confusión en el uso de un operador o una prioridad de operador.

Comentarios

El operador ! produce un resultado booleano y tiene una prioridad más alta que &. El operador bit a bit y (&) toma dos argumentos aritméticos. Por lo tanto, se ha detectado uno de los siguientes errores:

  • La expresión está entre paréntesis:

    Dado que el resultado de ! es booleano (cero o uno), un intento de probar que dos variables tienen bits en común solo acabará probando que el bit más bajo está presente en el lado derecho: ((!8) & 1) == 0.

  • El operador ! es incorrecto y debe ser un valor ~ en su lugar:

    El operador ! tiene un resultado booleano, mientras que el operador ~ tiene un resultado aritmético. Estos operadores nunca son intercambiables, incluso cuando funcionan en un valor booleano (cero o uno): ((!0x01) & 0x10) == 0x0, mientras que ((~0x01) & 0x10) == 0x10.

  • El operador binario & es incorrecto, debería ser &&:

    Aunque & a veces se puede intercambiar con &&, no es equivalente porque fuerza la evaluación del lado derecho de la expresión. Algunos efectos secundarios de este tipo de expresión pueden ser terminales.

Es difícil juzgar la gravedad de este problema sin examinar el código. El código debe inspeccionarse para asegurarse de que funciona según lo previsto.

Nombre del análisis de código: LOGICALNOTBITWISEAND

Ejemplo

El código siguiente genera esta advertencia:

void f(int x, int y)
{
  if (!x & y)
  {
    // code ..
  }
}

Para corregir esta advertencia, utilice el siguiente código de ejemplo:

void f(int x, int y)
{
  /* When testing that x has no bits in common with y. */
  if (!(x & y))
  {
    // code
  }

  /* When testing for the complement of x in y. */
  if ((~x) & y)
  {
    // code ...
  }
}
#include <windows.h>
void fC(int x, BOOL y )
 {
  /* When y is a Boolean or Boolean result. */
  if ((!x) && y)
  {
    // code ...
  }
}

La advertencia C6317 se notifica si el operador ! está en el lado derecho del operador &.

Consulte también