C6290

Actualización: noviembre 2007

C6290

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

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

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

  • Existe un error en el uso de paréntesis en la expresión:

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

  • El operador ! es incorrecto y se debe usar ~ en su lugar:

    El resultado del operador ! es booleano, pero el resultado del operador ~ es aritmético. Estos operadores nunca son intercambiables, aunque operen con un valor booleano (cero o uno): ((!0x01) & 0x10) == 0x0, pero ((~0x01) & 0x10) == 0x10.

  • El operador binario & es incorrecto, y en su lugar se debe utilizar &&:

    Aunque en ocasiones es posible intercambiar & con &&, no es equivalente, porque fuerza una evaluación del lado derecho de la expresión. Algunos efectos secundarios de este tipo de expresiones pueden ser terminales.

Es difícil juzgar la gravedad de este problema sin examinar el código. El código se debe inspeccionar para garantizar que se está efectuando la prueba deseada.

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 muestra si el operador ! está en el lado derecho del operador &.

Vea también

Referencia

C6317