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.