Compartilhar via


C6291

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

O ! operador produz um resultado booleano e o |(bit a bit- ou) operador leva dois argumentos de aritméticos.O ! operador também tem precedência maior do que|.

Portanto, um dos seguintes erros foi detectado:

  • A expressão é mis-parenthesised:

    Porque o resultado de ! é booleano (zero ou um), uma tentativa de testar duas variáveis tem bits definido será apenas acabam testes que o menor bit está presente no lado direito: ((!x) | y) != (!(x | y)) quando x == 0 e y == 1.

  • O ! operador está incorreto e deve ser um ~ em vez disso:

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

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

    Embora | às vezes, podem ser intercambiados com ||, não é equivalente, porque o força 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, podemos deve cancelar a ele para avaliar a outra metade da expressão.

Este aviso não é relatado se a ! operador está no lado direito das | operador porque neste caso é apenas o que acontece relativamente inócuos de um operador incorreto.

É difícil avaliar a gravidade deste problema sem examinando o código.O código deve ser examinado 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 do 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
  }
}