C6291
Aviso C6291: Operação bit a bit no resultado lógico: !tem precedência maior do que |.Uso || ou (!(x | y)) em vez disso
The ! operador retorna um resultado booliano e o |(bit a bit- ou) operador leva dois argumentos aritméticos.The ! operador também tem precedência maior do que|.
Portanto, um dos seguintes erros for detectado:
A expressão é mal parenthesised:
Como resultado de ! é booliano (zero ou um), uma tentativa de testar duas variáveis tem bits conjunto acabará somente testes que o menor bit está presente no lado direito: ((!x) | y) != (!(x | y)) Quando x == 0 e y == 1.
The ! operador incorreto e deve ser um ~ em vez disso:
The ! operador tem um resultado booliano, mas o ~ operador tem um resultado aritmético. Esses operadores nunca são intercambiáveis, mesmo quando operando em um valor booliano (zero ou um): ((!x) | y) != ((~x) | y) Quando x == 1 e y == 0.
Operador binário | está incorreto e, em vez disso, deve ser ||:
Mesmo que | às vezes pode ser intercambiados com ||, não é equivalente porque força avaliação do lado direito da expressão. Determinados efeitos colaterais nesse tipo de expressão podem ser terminal: (!p | (*p == '\0')), quando p == NULL, deve desreferenciar para avaliar a Outros metade da expressão.
Este aviso não é relatado se a ! operator is on the right side of the| operador porque neste caso é normalmente apenas relativamente inofensivo ao caso de um operador incorreto.
É difícil avaliar a gravidade desse problema sem examinar o código.O código deve ser inspecionado para garantir que o teste pretendido está ocorrendo.
Este aviso sempre indica uma possível confusão no uso de um operador ou a precedência de operador.
Exemplo
O código a seguir gera este aviso:
void f(int x, int y )
{
if (!x | y)
{
//code
}
}
Para corrigir esse aviso, use um dos métodos mostrados no código a seguir:
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
}
}