Partilhar via


C6290

Aviso C6290: operação bit a bit em resultado lógico:!tem precedência &.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 operadores.

O ! operador produz um resultado booleano e tem precedência maior do que o &.o bit a bit- e (e) operador leva dois argumentos de aritméticos.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 em comum será apenas final até que o menor bit está presente no lado direito de testes: ((!8) & 1) == 0.

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

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

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

    Enquanto & , à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 pode ser terminal.

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

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 exemplo de código 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 ...
  }
}

C6317 de aviso será relatado se a ! operador está no lado direito da & operador.

Consulte também

Referência

C6317