Compartilhar via


C6291

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

O operador de ! gerencie um resultado booliano, e |(bit a bit) ou o operador usa dois argumentos aritméticos.O operador de ! também tem uma precedência maior que|.

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 os bits definidos apenas terminarão acima testar se o mais baixo bit estiver presente no lado direito: ((!x) | y) != (!(x | y)) quando x == 0 e y == 1.

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

    O operador de ! tem um resultado booliano, mas o operador de ~ tem um resultado aritmético.Esses operadores nunca são intercambiáveis, mesmo quando se operando em um valor booliano (zero) ou um: ((!x) | y) != ((~x) | y) quando x == 1 e y == 0.

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

    Mesmo que | às vezes pode ser intercambiado com ||, ele 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: (!p | (*p == '\0')), quando p == NULLnós, deverá o desreferenciar para avaliar a outra metade da expressão.

Esse aviso não é relatado se o operador de ! estiver no lado direito de | operador porque esses casos são normalmente apenas os exemplos relativamente inofensivos de um operador incorreto.

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

Esse aviso sempre indicará uma possível confusão no uso de um operador ou de uma 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 mostradas no seguinte código:

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