C6290

警告 C6290:对逻辑结果的位运算: ! 的优先级高于 &。请改用 && 或 (!(x & y))

此警告指出可能在使用运算符或运算符优先级时产生混淆。

! 运算符生成布尔型结果,它的优先级高于 &。按位与(&)运算符采用两个算术参数。因此,检测到下列错误之一:

  • 表达式的括号使用有误:

    因为 ! 的结果是布尔值(0 或 1),所以,当本来要测试两个变量是否具有相同的位时,实际却是测试最低位是否出现在右侧:((!8) & 1) == 0。

  • ! 运算符有误,应改用 ~:

    ! 运算符的结果为布尔值,而 ~ 运算符的结果为算术值。这两个运算符决不能互换,即使在对布尔值(0 或 1)进行运算时也是如此:((!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