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


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