Sdílet prostřednictvím


C6291

upozornění C6291: bitová operace na logický výsledek:!má vyšší prioritu než |.Použití || nebo (! ()x | y)) místo

! Operátor dává výsledek a |(bitového- nebo) operátor má dva argumenty aritmetické.! Vyšší prioritu než má operátor|.

Proto jednu z následujících chyb byl zjištěn:

  • Výraz je mis parenthesised:

    Protože v důsledku ! je logická hodnota (nula nebo jedna), pokus o test, zda mají dvě proměnné bity budou nakonec pouze testování nejnižší bit představuje v pravé: ((!x) | y) != (!(x | y)) při x == 0 a y == 1.

  • ! Operátor je nesprávné a musí být ~ místo:

    ! Operátor má logickou, ale ~ má operátor aritmetický výsledek.Tyto operátory jsou zaměnitelné, nikdy i když na logickou hodnotu (nula nebo jedna): ((!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 zaměnitelné, s ||, není rovnocenné, protože nutí hodnocení v pravé části výrazu.Některé vedlejší účinky v tomto typu výraz může být terminálu: (!p | (*p == '\0'))při p == NULL, jsme nutné zrušit reference struktury na druhou polovinu výraz vyhodnotit.

Pokud není hlášeno toto upozornění ! operátor je na pravé straně | provozovatel tohoto případu je obvykle pouze relativně neškodné případ nesprávného operátor.

Je obtížné posoudit bez prozkoumávání kód závažnost tohoto problému.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 používá operátor nebo priority operátorů.

Příklad

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

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

Chcete-li opravit 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
  }
}