Поделиться через


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.

См. также

Ссылки

C6317