Sdílet prostřednictvím


C6290

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

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

! Operátor dává výsledek a má vyšší prioritu než &.Bitového- a (a) operátor má dva argumenty aritmetické.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 společné pouze nakonec testování nejnižší bit představuje v pravé: ((!8) & 1) == 0.

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

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

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

    Při & někdy zaměnitelné, s &&, není rovnocenné, protože nutí hodnocení v pravé části výrazu.Některé vedlejší účinky v tomto typu výrazu lze terminálu.

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.

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