C6290
Предупреждение C6290: побитовая операция над логическим результатом. "!" имеет более высокий приоритет, чем "&". Используйте "&&" или "(!(x & y))".
Данное предупреждение указывает на возможную неоднозначность в использовании оператора или порядке применения операторов.
Оператор ! возвращает логическое значение, и он имеет более высокий приоритет по сравнению с &.Оператор & (битовое И) принимает два арифметических аргумента. Поэтому обнаружена одна из следующих ошибок.
Неправильное использование скобок в выражении
Поскольку результатом оператора ! является логическое значение (ноль или один), попытка проверки совпадения битов двух переменных сводится к проверке того, что в правой стороне присутствует наименьший бит: ((!8) & 1) == 0.
Оператор ! используется здесь неверно, и его следует заменить на оператор ~.
Оператор ! возвращает логическое значение, тогда как оператор ~ возвращает арифметический результат. Эти операторы не являются взаимозаменяемыми даже в том случае, если применяются к логическому значению (ноль или один): ((!0x01) & 0x10) == 0x0, когда ((~0x01) & 0x10) == 0x10.
Бинарный оператор & используется неверно, и его следует заменить на оператор &&.
Иногда операторы & и && можно применять в одних и тех же ситуациях, однако они не являются эквивалентными, поскольку при использовании первого оператора выполняется принудительное вычисление правой стороны выражения. В результате использования такого рода выражений могут возникать определенные побочные эффекты.
Серьезность данной проблемы можно определить только после изучения кода. Следует исследовать код и убедиться в выполнении именно той проверки, которая предполагалась.
Пример
Данное предупреждение создается в следующем коде:
void f(int x, int y)
{
if (!x & y)
{
// code ..
}
}
Для устранения этого предупреждения используйте следующий пример кода:
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 ...
}
}
Если оператор ! расположен справа от оператора &, создается предупреждение C6317.