C6290
Aviso C6290: Operação bit a bit no resultado lógico: !tem precedência maior do que &.Uso && ou (!(x & y)) em vez disso
Este aviso indica uma possível confusão no uso de um operador ou uma precedência de operador.
The ! operador retorna um resultado booliano e tem precedência maior do que o &. O bit a bit- e (&) operador leva dois argumentos aritméticos. 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 será apenas participante até que o menor bit está presente no lado direito de teste em comum: ((!8) & 1) == 0.
The ! operador incorreto e deve ser um ~ em vez disso:
The ! operador tem um resultado booliano, enquanto o ~ operador tem um resultado aritmético. Esses operadores nunca são intercambiáveis, mesmo quando operando em um valor booliano (zero ou um): ((!0x01) & 0x10) == 0x0, enquanto ((~0x01) & 0x10) == 0x10.
O operador binário & está incorreto e, em vez disso, deve ser &&:
Ao mesmo tempo em 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 pode ser terminal.
É 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.
Exemplo
O código a seguir gera este aviso:
void f(int x, int y)
{
if (!x & y)
{
// code ..
}
}
Para corrigir esse aviso, use o código de exemplo a seguir:
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 ...
}
}
Aviso C6317 é relatado se a ! operador está no lado direito das & operador.