Udostępnij za pośrednictwem


C6291

Ostrzeżenie C6291: Operacja bitowa na wyniku logicznym: !ma pierwszeństwo przed |.Zamiast tego użyj operatora ||, lub (!(x | y)).

Operator ! daje wynik będący wartością logiczną oraz operator |(bitowy-lub) ma dwa argumenty arytmetyczne.Operator ! ma również pierwszeństwo przed|.

Dlatego został wykryty jeden z następujących błędów:

  • Wyrażenie jest pozbawione nawiasów:

    Ponieważ wynik ! jest wartością logiczną (zero lub jeden), próba badania dwóch zmiennych, czy mają ustawione bity, zostanie zakończenia testowaniem tylko najmłodszego bitu po prawej stronie: ((!x) | y) != (!(x | y)) gdy x == 0 i y == 1.

  • Operator ! jest nieprawidłowy i zamiast tego powinien być ~:

    Operator ! ma wynik będący wartością logiczną, a operator ~ ma wynik będący wartością arytmetyczną.Operatory te nigdy nie są wymienne, nawet wtedy, gdy operuje się na wartości logicznej (zero lub jeden): ((!x) | y) != ((~x) | y) gdy x == 1 i y == 0.

  • Operator binarny | jest niepoprawny, a zamiast niego należy użyć ||:

    Mimo że | można czasami wymienić z ||, nie jest on równoważny, ponieważ zmusza do oceny prawej strony wyrażenia.Pewne efekty uboczne w tym typie wyrażeń mogą być ostateczne: (!p | (*p == '\0')), gdy p == NULL, trzeba dokonać dereferencji, aby oszacować drugą połowę wyrażenia.

To ostrzeżenie nie jest zgłaszane, jeśli operator ! jest po prawej stronie operatora | , ponieważ ten przypadek jest zazwyczaj stosunkowo nieszkodliwym przypadkiem nieprawidłowego operatora.

Trudno ocenić powagę problemu bez konieczności sprawdzania kodu.Kod powinien zostać skontrolowany, aby zapewnić wystąpienie zamierzonego testu.

To ostrzeżenie zawsze wskazuje możliwe nieporozumienia w przypadku użycia operatora lub pierwszeństwa operatorów.

Przykład

Poniższy kod generuje to ostrzeżenie:

void f(int x, int y )
{
  if (!x | y)
  {
    //code 
  }
}

Aby poprawić to ostrzeżenie, należy użyć jednej z metod w poniższym kodzie:

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