C6291
Actualización: noviembre 2007
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 | (OR bit a bit) utiliza 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 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 expresión pueden ser terminales: (!p | (*p == '\0')), cuando p == NULL, es preciso eliminar las referencias para evaluar la otra mitad de la expresión.
Esta advertencia no se muestra si el operador ! está a la derecha del operador | porque se trata precisamente del caso relativamente inocuo de uso incorrecto de un operador.
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
}
}