Sdílet prostřednictvím


C6290

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

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

! Operátor vrací logickou a má vyšší prioritu než &.Bitového- a (&) operátor má dva argumenty aritmetických operací.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, zda mají dvě proměnné bity společné bude pouze skončí testování na pravé straně nachází nejnižší bit: ((!8) & 1) == 0.

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

    ! Operátor má logickou, zatímco ~ aritmetický výsledek má operátor.Tyto operátory jsou zaměnitelné, nikdy, i když pracují na hodnotu typu Boolean (nula nebo jeden): ((!0x01) & 0x10) == 0x0, zatímco ((~0x01) & 0x10) == 0x10.

  • Binární operátor & není správná a měla by být &&:

    Při & v některých případech 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 terminálu.

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.

Příklad

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

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

Pro opravu tohoto upozornění použijte následující ukázkový kód:

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

Hlášení C6317 upozornění, pokud ! operátor je na pravé straně & operátor.

Viz také

Referenční dokumentace

C6317