Compartilhar via


C6290

aviso C6290: Operação bit-a-bit em resultado lógico: ! tem precedência maior do que &.Use && or (!(x & y)) em vez disso

Esse aviso indicar uma possível confusão no uso de um operador ou de uma precedência de operador.

O operador de ! gerencie um resultado booliano, e tem uma precedência mais alta do que &.bit a bit e o operador (&) usam dois argumentos aritméticos.Consequentemente, um dos seguintes erros foi detectado:

  • A expressão mis- é ativada entre parênteses:

    Como o resultado de ! é booliano (zero) ou um, uma tentativa de teste que duas variáveis têm bit em comum terminarão somente acima testar se o mais baixo bit estiver presente no lado direito: ((!8) & 1) == 0.

  • O operador de ! estiver incorreto, e deve ser ~ em vez de:

    O operador de ! tem um resultado booliano, quando o operador de ~ tenha um resultado aritmético.Esses operadores nunca são intercambiáveis, mesmo quando se operando em um valor booliano (zero) ou um: ((!0x01) & 0x10) == 0x0, quando ((~0x01) & 0x10) == 0x10.

  • O operador binário & está incorreto e, por isso deve ser &&:

    Quando & às vezes pode ser intercambiado com &&, não é equivalente como força a avaliação do lado direito da expressão.Certos efeitos colaterais nesse tipo de expressão podem ser terminais.

É difícil julgar a severidade esse 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 seguinte código de exemplo:

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 ...
  }
}

C6317 de aviso é informado se o operador de ! estiver no lado direito do operador de & .

Consulte também

Referência

C6317