Sdílet prostřednictvím


C6291

upozornění C6291: Bitová operace na logický výsledek: ! má vyšší prioritu než |.Namísto toho použijte raději || nebo (!(x | y))

! Operátor vrací logickou a |(bitové operace- nebo) operátor má dva argumenty aritmetických operací.! Také má vyšší prioritu než operátor|.

Proto byla zjištěna jedna z následujících chyb:

  • Výraz je mis-parenthesised:

    Protože výsledek ! je logická hodnota (nula nebo jeden), pokus o test, že dvě proměnné obsahovat bity budou nakonec pouze testování, je k dispozici na pravé straně nejnižší bit: ((!x) | y) != (!(x | y)) při x == 0 a y == 1.

  • ! Operátor je nesprávná a by měl být ~ místo:

    ! Operátor má logickou, ale ~ má operátor aritmetický výsledek.Tyto operátory jsou zaměnitelné, nikdy, i když pracují na hodnotu typu Boolean (nula nebo jeden): ((!x) | y) != ((~x) | y) při x == 1 a y == 0.

  • Binární operátor. | je nesprávné a měla by být ||:

    Přestože | Někdy jsou navzájem zaměnitelné s ||, není ekvivalentní, protože nutí vyhodnocení výraz pravé straně.Některé vedlejší účinky v tomto typu výraz může být koncová: (!p | (*p == '\0')), když p == NULL, jsme musí přistoupit přes ukazatel pro hodnocení druhé poloviny výraz.

Toto upozornění není uvedena, pokud ! operátor je na pravé straně | operátor vzhledem k tomu, že tento případ nastane, obvykle stačí relativně neškodné nesprávného operátoru.

Je obtížné posoudit závažnost tohoto problému, bez prozkoumání kódu.Kód by měly podléhat kontrole zajistit probíhající zamýšlené test.

Toto upozornění vždy označuje možné záměně vyhnout při použití operátoru nebo priority operátorů.

Příklad

Následující kód generuje toto upozornění:

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

Chcete-li toto upozornění, použijte jednu z metod, viz následující kód:

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