Compartir a través de


C6291

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

El operador ! produce un resultado Booleano y el operador |(O bit a bit) acepta dos argumentos aritméticos.Además, el operador ! tiene mayor prioridad que|.

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 establecidos sólo permitirá probar que el bit más bajo está presente en el lado derecho: ((!x) | y) != (!(x | y)) cuando x == 0 y y == 1.

  • 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): ((!x) | y) != ((~x) | y) cuando x == 1 y y == 0.

  • El operador binario | es incorrecto y debe ser en su lugar ||:

    Aunque | en ocasiones se puede intercambiar con || no es equivalente, porque fuerza una evaluación del lado derecho de la expresión.Algunos efectos secundarios de este tipo de expresión pueden ser terminales: (!p | (*p == '\0')), cuando p == NULL, es precisa su desreferenciación para evaluar la otra mitad de la expresión.

Esta advertencia no se muestra si el operador ! está a la derecha del | porque este caso típicamente suele ser solo el caso relativamente inocuo de un operador incorrecto.

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.

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

Ejemplo

El código siguiente genera esta advertencia:

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

Para corregir esta advertencia, utilice uno de los métodos mostrados en el código siguiente:

void fC(int x, int y )
{
  /* When checking whether any bits are set in either x or y. */
  if (!(x | y))
  {
    // code
  }
  /* When checking whether bits are set in either */
  /* the complement of x or in y. */
  if ((~x) | y)
  {
    // code
  }
}

#include <windows.h>
void f(int x, BOOL y )
{
  /* When y is a Boolean or Boolean result. */
  if ((!x) || y)
  {
    // code
  }
}